最近在优化mysql项目部分页面查询较慢的问题时总结出的若干经验,分享如下:
1.查询时如果需要联合其它表查询尽量避免在from之前的sql查询字段中去直接查其它表,这样会导致有几条数据就需要查几次其它表,效率比较堪忧,比如下面这种写法:
还是应该使用关联表的写法去查询,这样主表与每个子表只需关联一次就可以了。?上面的写法改为如下这种,在查询字段中去取关联表对应的字段即可。
2.给相关页面搜索条件酌情添加索引,如果重复率高的条件则不添加,如刚优化完成的区域药品项目药品信息页面有个是否有效的搜索条件,表中该字段几乎都为有效,这种情况下无需创建索引,创建了之后甚至还得浪费存储空间去存储创建的索引;此外在给相应字段创建索引后需注意sql语句的写法,项目优化过程中发现虽然字段加了索引,但是真正查询的时候实际上是没有引用到此索引的,比如在项目优化过程中发现很多时间字段的where条件查询时使用了date_forma函数去转换表本身的字段类型,这种情况会导致该时间字段的索引失效,正确的写法是改为使用str_to_date函数去转变传入的值类型的方式去查询,如下图所示:
右边即为正确写法:
3.关于创建了索引之后在查询过程中是否使用了索引,可以使用 explain 关键字进行分析,写法示例:
假如我们给basic_sys_drug 表的DRUG_CODE创建了索引,使用下面语句查询
explain select * from basic_sys_drug where DRUG_CODE='1000000'
搜索结果为:
? 重点关注其中的key列的值,key的值就是实际使用的索引名。如果为null,则表示没有使用索引。
4.最后附上通过创建索引优化时,索引失效的几种情况,在实际使用时需要注意一下:
<1>.如果where条件中有or,即使其中有条件带索引也不会走索引查询,要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引; <2>.如果WHERE查询条件里使用了函数(如上述情况中的:WHERE date_forma(column)=…),MYSQL将无法使用索引; <3>.对于多列索引,如果where条件中没有使用到第一个索引字段,则不会使用索引; <4>.like模糊查询以%开头(左模糊)不会使用索引,如果是右模糊则不受影响; <5>.除了上述几种情况如果发现即使创建了索引依然没有生效,则极有可能是mysql在查询之前会大致估算使用全表扫描如果要比使用索引快,或者查询结果占表中数据 的大多数比重,这种情况下也不会使用索引,就像上面第二点中描述的药品信息页面的是否有效字段。所以在创建索引时应考虑创建之后是否会对效率有明显提升,否则 可能会适得其反。
|