在进行数据统计时很多时候由于数据存储的结构问题,要实现需求写出的SQL语句非常复杂。一般来讲,越简单的语句查询的速度越快,在少量数据的情况下,我们不会去主要语句的可执行性,在生产环境下,一个表可能存放在大量的数据,复杂语句在执行的时候,不仅仅得不到结果,可能还会造成服务器卡死。
在生产服务器上就得非常注意SQL语句的可执性,把复杂的SQL拆分为多条简单的SQL是其中的一种方式,另一种方式是使用索引,合理的索引也能大大的提高查询的数据。
索引简单原理
有过算法基础,通常都知道查找算法,一个有序的数组查询,时间复杂度比一个无序的数组查询要小一个数量级,因为有序的数组我们就可以用二分查找,建立索引的过程原理上跟这个差不多,建立起有序的排序,利用查找算法,提高查找的速度。
利用索引进行查询
用 Navicate
建立索引也较为容易,在设计表格中就有建立索引的选项,现在看看在还没有建立索引时,下面语句的执行情况:
select * from students where age = 20
点击解释语句:
在返回的表格Extra
使用的是Using where
,type
使用的是ALL
,预示着在查找的过程中,使用的是普通查找,可能需要扫描全表,扫描的表是无序的,这种查询性能较低。
如何才能提高查询效率呢?
在查询语句中where
使用的条件是age
,这里对age
建立索引:
进行同样的语句查询解释:
在possible_keys
和key
中我们看到了,查询的时候命中了刚才的索引age
。在数据量大的情况下,查询的速度会大大的提升。
组合索引
再来看看,下面的这种情况,这SQL语句,怎么样来建立索引
select * from students where age = 20 and sex = '男'
语句的解释如下:
使用的是using where,在查找时需要扫面表里面全部数据,性能比较低下。
查询时用了两个条件 age
和 sex
,可以 建立组合索引 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语句不仅仅影响到查询的数据,还影响到服务器的负载,每次在考虑业务的时候,同样的要考虑语句的写法。