作者回复: 新年好
好问题,我加到后面文章中。
简单说下结论,只需要去重的话,如果没有limit,是一样的;
有limit的话,distinct 快些。
漂亮的回答👍
作者回复: 👍🏿
春节快乐
作者回复: 👍很好的总结
作者回复: 是的,非常好的验证和思考👍
sort_buffer、join_buffer、内存临时表和磁盘临时表 都是server层的,引擎间共用
作者回复: 1. 最后的结果是“直接使用排序”
2. 就是认为用sort_buffer直接排序性能更好,所以就没有使用内存临时表或磁盘临时表
3. 没有索引的内存表可以认为就是数组; 主键不是,内存表的表结构,可以看一下38篇
作者回复: 因为索引c的信息也足够,而且比主键索引小,使用索引c更会好。
“如果字段a上有空值,使用索引a岂不是就不能取到所有的id值了?”,不会的
作者回复: 1. 是的,我默认是用5.7做的验证,这里5.7做了优化。
2. 其实你已经找到原因了,就是因为5.6的默认临时表是myisam表,而myisam表是堆表,这里的堆表,跟38篇介绍的memory引擎是类似的,你看了那篇应该就能知道为什么堆表是最后显示0那行了
3. 好问题,不同id从大到小,相同id从上到下
4. 多谢你的鼓励,还没定,先休息下^_^
不好意思,你发的第一天就看到了,回复晚了😆
作者回复: 这三种写法语义上不一样。。
如果对返回结果没有顺序要求,那写上order by null肯定是好的。
“order by null”和“不加order by”不等价,咱们文中有说哈
作者回复: 看索引的名字猜测, idx_aid_day_pv 就是(adid, day,pv)这三个字段的联合索引?
这样的话,第二个语句就会顺序遍历索引,只要找到10个不同的aid就可以了,这个索引不用全部遍历;这样可以减少很多写入临时表的数据;
但是第一个语句是day开头的, 这样就必须将所有`day`>20190115的记录都存到临时表中,这个要写入内存表的数据行数肯定比第二个语句多的
所以核心就是这两个语句需要放入临时表的行数不同。
作者回复: 需要创建临时表的时候,与当前访问数据的引擎无关,都是默认创建内存临时表,内存不够了转磁盘临时表(默认是innodb 表)
作者回复: 1. 啊 比较奇怪,你可否给一下截图,(比如发个微博,贴图at我),带上表结构哈
2. 好问题,其实这个是要结合下一篇文章的知识点,内存表的主键不是保证有序的
作者回复: 对的,👍🏿细致
发起勘误了,新年快乐
作者回复: 新年快乐~🤝
作者回复: 新年好~
👍
作者回复: 新年快乐🤝
作者回复: 春节快乐,🤝