mysql怎么优化条件 mysql优化十大技巧( 六 )


(4).Using filesort
看到这个的时候,查询就需要优化了 。MYSQL需要进行额外的步骤来发现如何对返回的行排序 。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行;
(5).Using temporary
看到这个的时候,查询需要优化了 。这里 , MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上;
(6).Using index
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的 , 这发生在对表的全部的请求列都是同一个索引的部分的时候 。
(7).Using where
使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户 。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生 , 或者是查询有问题 。
如何优化mysql数据库 。从外在条件来说 , 优化mysql涉及优化硬件、优化磁盘、优化操作系统、选择应用编程接口等 。
二、优化硬件
如果你需要庞大的数据库表(2G),你应该考虑使用64位的硬件结构,像Alpha、Sparc或即将推出的IA64 。因为MySQL内部使用大量64位的整数,64位的CPU将提供更好的性能 。
对大数据库,优化的次序一般是RAM、快速硬盘、CPU能力 。
更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新 。
如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查,一台UPS就能够在电源故障时让系统安全关闭 。
对于数据库存放在一个专用服务器的系统,应该考虑1G的以太网 。延迟与吞吐量同样重要 。
MySQL优化:order by和limit1. 对order by使用复合索引
order by和limit一起使用,避免引起全表扫描和数据排序是非常重要的,因此借助合适的索引提高查询效率 。
使用联合索引
联合索引又叫复合索引,是由表中的几个列联合组成的索引 。联合索引生效需满足最左前缀原则,即如果联合索引列为a,b,c三列,a,b,c 、a,b 、a生效,b,c、a,c、b、c等不生效(此处的顺序不是where条件后面的先后顺序,而是where条件中是否存在这些列 , 如果where中只存在a,c列,则不生效) 。
索引生效,与where条件的顺序无关:
索引失效,与where条件的列是否存在有关:
带IN条件的联合索引失效
in的参数个数为1个,联合索引生效 , 大于1个 , 索引失效 。所以使用了强制索引使联合索引生效 。
原因分析:
第一、取决于B树的数据结构,单参数的IN只会得到一颗基于model子树,该子树的code本身是有序的,所以索引生效,查询效率高;多参数的IN会得到多颗基于model的子树,每颗子树的code字段是有序的,但是总体上可能不是有序的,所以索引失效,查询效率低 。
第二、使用强制索引后,理论上无法保证order by的顺序,但是如果数据本身的特性,比如时间递增的这类数据,总体上还是有序的,笔者试过多中途径想要迫使强制索引得到错误的结果,结果都对了 。强制索引需进一步研究 。
2. 大数据量limit慎用
limit常用于分页中,有两种用法,三种写法:
偏移量offset较大的优化
limit偏移量较小时性能优秀,分页越到后面,偏移量递增,limit的性能会逐渐下降 。
此时,通过子查询优化limit,效果如下:
以上数据来自一张超过2000万的MySQL单表 , 仅供参考,能够说明子查询明显能够提升效率,笔者开始尝试把子查询的order by去掉 , 发现查询效率又提升2倍,但是对比发现数据不正确 , explain后发现查询优化器给出的子查询索引并不是id(此表建有多个索引,id是主键,区分度最高),这一点比较困惑 。

推荐阅读