第八章 索引和优化

在进行数据统计时很多时候由于数据存储的结构问题,要实现需求写出的SQL语句非常复杂。一般来讲,越简单的语句查询的速度越快,在少量数据的情况下,我们不会去主要语句的可执行性,在生产环境下,一个表可能存放在大量的数据,复杂语句在执行的时候,不仅仅得不到结果,可能还会造成服务器卡死。

在生产服务器上就得非常注意SQL语句的可执性,把复杂的SQL拆分为多条简单的SQL是其中的一种方式,另一种方式是使用索引,合理的索引也能大大的提高查询的数据。

索引简单原理

有过算法基础,通常都知道查找算法,一个有序的数组查询,时间复杂度比一个无序的数组查询要小一个数量级,因为有序的数组我们就可以用二分查找,建立索引的过程原理上跟这个差不多,建立起有序的排序,利用查找算法,提高查找的速度。

利用索引进行查询

Navicate 建立索引也较为容易,在设计表格中就有建立索引的选项,现在看看在还没有建立索引时,下面语句的执行情况:

select * from students where age = 20

点击解释语句:

在返回的表格Extra 使用的是Using wheretype 使用的是ALL,预示着在查找的过程中,使用的是普通查找,可能需要扫描全表,扫描的表是无序的,这种查询性能较低。

如何才能提高查询效率呢?

在查询语句中where使用的条件是age,这里对age建立索引:

进行同样的语句查询解释:

possible_keyskey中我们看到了,查询的时候命中了刚才的索引age。在数据量大的情况下,查询的速度会大大的提升。

组合索引

再来看看,下面的这种情况,这SQL语句,怎么样来建立索引

select * from students where age = 20 and sex = '男'

语句的解释如下:

使用的是using where,在查找时需要扫面表里面全部数据,性能比较低下。

查询时用了两个条件 agesex,可以 建立组合索引 age,sex,让查询完全的命中:

再看刚才的语句索引的命中情况:

key 使用的是as的索引,命中了刚才建立的索引。

通过索引进行like查询

在查找时,like 是经常用到的,如:

SELECT * FROM `students` where `name` like '王%'

查询 name 开头的第一个字为 。建立name索引,查询走了索引,

Extra 中使用的是 Using index condition,表示进行索引查询了。

同样是like查询语句,

SELECT * FROM `students` where `name` like '%王'

在查询的时候并没有走索引,

因此在使用的like进行查询的时候,就得特别的注意,只有 % 放在后面时才能命中索引,其他的情况是不行的。

其他优化

同时在可能返回大量结果的时候,可以用limit 来显示返回的结果条数,索引如果已经找到了符合结果条数,马上就可以返回,而不用继续的进行查找,同样能够提高查询速度。 如何优化SQL语句,如何根据自己的查询建立起索引都是在SQL查询中必须考虑的。一条好的SQL语句不仅仅影响到查询的数据,还影响到服务器的负载,每次在考虑业务的时候,同样的要考虑语句的写法。


所有评论

写了这么多年博客,收到的优秀评论少之又少。在这个属于 SNS 的时代也并不缺少向作者反馈的渠道。

还没有评论

撰写评论