mysql查询慢是一个常见问题,当单表数据量一大,关联表一多查询就慢,最好的办法就是优化sql和创建合适的索引,如何优化sql不在本篇细讲,本篇主要讲,在复杂查询情况下,如何创建合适的索引,mysql技术资料或者书籍上讲解的也都是几个简单法则,一旦遇到复杂的多表查询,就显得过于简单,亦或是高手优化了一下索引,却也不敢打包票是否已是最佳,显得仿若羚羊挂角撞运气。本篇讲的就是在复杂查询背景下,通过研究sql查询的路线,创建匹配查询路线的索引,从而获得极致的查询速度的一套方法。
一、创建索引疑惑
创建索引是否必要不必说,只是对以下两点常见的疑惑进行解释
1,sql和索引谁先谁后?先有sql,然后分析sql,然后根据需要创建索引
2,要创建多少索引?一个表索引多了对性能有影响,有多少影响?一张表在系统中对应若干sql,分析每一个sql可能都有索引需求产生,这样汇总后索引多了,怎么办?
根据sql需要创建索引,需要就创建,增加索引对数据库影响可以忽略,因为一条索引,只会让数据库服务器增加一个异步线程,增加一条好的索引,能加快数据的查询,提高cpu的效能,所获得的收益,远远大于一个线程的损耗;反过来看, 增加索引带来的损耗,可以通过堆叠的方式来削减,增加CPU核数,能够提供更多的并行线程(一个CPU核=两个线程),增加磁盘,抵消索引带来的磁盘消耗(一个索引一个表的拷贝)。所以如果按查询必须越快越好的要求,那么就应该大胆创建索引。
二、案例
我们以小学业务系统为例: