MYSQL数据库查询优化总结
关系型数据库查询的瓶颈:
1. 磁盘IO(最主要的)——使用聚簇索引,减少多次IO
在mysql中,一次IO会将要查询数据的前后几页一并带入到内存中,查询的数据顺序和数据在物理存储的位置顺序一致,则会在内存进行查询,减少了IO,这个速度是非常快的。
2. 索引优化——尽量做到3星索引(覆盖索引),避免多个范围条件,去除冗余和重复索引
索引的优点:1)大大减少了服务器需要扫描的数量
2)可以帮助服务器避免排序和临时表
3)索引可以将随机IO变为顺序IO
建立一个好的索引有以下几个原则:
1)选择性越高越好。索引的选择性是指该字段中 不重复值/总记录数。选择性高的索引可以让MYSQL在查找时过滤掉更多的行。
2)建立合适顺序的多列索引。在大多查询中,对于条件的限制不止一列,这个时候就需要建立合适的多列索引,最优先的原则是避免随机IO和排序。在不考虑这两个的情况下,选择性高的排在前面通常是很好的。
3)避免随机IO。使用聚簇索引能够很好的避免随机IO,避免随机IO能够极大的提升密集型应用的性能。
3. 查询方式优化——切分查询,分解复杂查询,优化特定查询类型
项目优化的例子:
1. 查询的时候按F1字段查,就在插入SQL表的时候按物理顺序
force index(PRIMARY)强行插入 F1字段(select字段时会慢,但是会把你需要的东西放在内存里,会加快查询的速度)
即in 3000 条数据在同一个物理块上 减少了磁盘IO
2. 如果字段较少,则使用覆盖索引便可以达到按字段从新在物理快上排序
3. 重新改表的结构,是在一个index中有多个表按公司ID查询,无法做到在插入的时候force index(PRIMARY),表1物理同步了,但是表2没有。
特殊情况:表2如果是覆盖索引,那么多次访问就会在内存里,速度就会很快。
所以要把所有的表都做到按照F1进行物理排序,插入时也用物理排序。
4. 在有KEY LIST 的业务时,应该以KEY作为表的主键,进行聚集,这样能够一次IO查完。