高性能MYSQL——查询总结
In
- 通过EXPLANE可得知,in被解释为type:Range的查询;然而实际上其本质还是被转化为“多个等值条件”查询(即排序再in索引之后的索引还是可用的)。
- Mysql对于in的执行:首先将in列表中的数据排序,然后根据二分查找,确定数据是否在in列表中。所以对于in中有大量数据的情况,如果是Or操作,时间复杂度为O(n),而in操作为O(logn)。
Group by
- 当group by的字段不是索引时,mysql一般会使用到的:
- 临时表
- 文件排序
因为数据库将自动安装分组字段进行排序,要避免排序操作,可以显式执行order by null;
Order by
- order by的字段顺序要和索引的顺序一致,否则将会产生文件排序;
- 通过索引排序,需要每读取一个索引都回表查询其他字段,是随机I/O事件;若需要的可以被覆盖索引查询,避免随机I/O操作,将大大提升性能;
- 当使用limit但数值过大时,可以使用延迟关联,先使用覆盖索引查询主键,再查询剩余字段;
- 关联查询:若order by中的列都来自第一个表,则先排序后关联,此时Using index/filesort;否则先关联,产生一个临时表,再排序,此时Using temporary;Using filesort;
索引的字段顺序
- 与order by的顺序一致;
- 把需要做范围查询的列放在后面;
临时表
主要的功能,排序和分组:Group by/Order by
- Order by子句和Group by子句不同, 例如:Order by price Group by name;
- 关联查询,使用了不是第一个表的列;
其他使用临时表的操作:union查询;子查询等 。