上周客户的系统有一个网页反应超级缓慢,最后帮客户定位到原因是sql慢查询,在这儿简单总结一下。
当数据库中的数据量非常大的时候,数据库访问的速度会越来越慢,cpu和内存消耗变大,影响用户体验,可以通过创建索引来解决。
我做了一个实验验证了一下,效果非常明显。
首先创建了一个数据表,通过脚本插入了1400w条数据(脚本跑了一晚上);
之后通过一个字段(非主键)进行查询
结果如上图所示,查询用时近10秒,这个速度确实是非常慢了。
之后我再给“property”这个字段创建索引
create index pindex on property(property);
之后再进行相同的操作,结果如下:
这次耗时几乎为0
实验证明创建索引的确能非常明显的增加查询性能
索引工作原理其实很简单,如果通过某个字段(非主键)进行查询,此时数据库会进行全表扫描,非常消耗资源。创建索引后,数据库会把创建索引的这个字段拿出来,重新分配资源建立索引,就像一本书的目录一样。
创建索引后,sql执行的时候会自动判断该字段有没有索引。
索引分:唯一索引、非唯一索引、主键索引、聚集索引。
创建非唯一索引的方法:
create index index_name on table_name(colunm_name);
查看索引的方法:
show index from table_name;
删除索引的方法:
drop index index_name on table_name;
当然索引也是有弊端的,索引会降低插入数据的效率,因为每次增删改数据的时候同时也需要创建一份索引的数据结构,增加了资源消耗,另外索引也是需要占用一部分磁盘空间的。
除了创建索引之外,还有其它一些方法可以在一定程度上降低sql慢查询。
1.避免全表查询的操作;
2.避免使用select * from 的操作,需要什么字段就查什么字段;
3.避免使用!= 、in、not in、or、like等不确定查询的语句;
4.避免在sql语句where之前进行计算的查询;