mysql设计基础题

小菜我又来问问题了

有个表

CREATE TABLE `NewTable` (
`id`  int NULL ,
`month`  int NULL ,
`data`  varchar(255) NULL 
)

month的数据大概是 1,1,2,2,2,3,6,8,8,10,12
现在给定9需要查出小于等于9的月份一个月,我想到的是
方法一:

select max(month) form newtabel where month<=9

方法二:

select month from newtabel where month<=9 order by month desc limit 1

请问:
1.数据量小肯定区别不大,数据量大的时候,哪个更优?
2.还有其他更好的写法不
3.mysql这种测试怎么做,有是什么好工具,我好自己去搞,省得小菜问题老是麻烦大家~

阅读 2.6k
3 个回答

首先你可以学习一下explain,用于sql分析,数据创建的话可以学习一下存储过程

如果的确有大量数据,需要频繁查询,那就给month添加索引,第二种写法的性能可能更优,参考:https://stackoverflow.com/que...,不过会受表结构,索引,引擎等多个因素影响,你也可以按照这里的答案来用explain分析语句,另外查看语句执行时间的工具挺多的,show profiles应该也可以满足需求。

不过month这一列本身的区分度不高,不适合建索引,如果实际场景是date的话更适合。这就引申出一个问题:你的这个查询背后的业务场景是什么,如果只针对大表中这些月份查某个最大的月份的一条数据,性能又是大问题,不如维护一张每个月只有一个条目的小表,更新时刷新这张小表中的数据。

大家都是基于你这个场景本身来思考的,我从另外一个角度来给你提个建议,不要只局限于MySQL

你这种数据,其实最适合的不是用MySQL,这种月份区分很明显的,而且只是指定某个月,特别适合用ClickHouse处理,MySQL你可以存一份数据,但是具体的数据业务逻辑你可以放到ClickHouse做处理。而且你这种以月份的形式处理,特别适合做稀疏索引,所以,用ClickHouse没错的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题