Mysql的InnoDB引擎在查询优化方面非常弱,因此需要一些注意事项:
1. where条件中的字段类型和数据库中的字段类型不一致时,不会使用索引。例如Flag='6'和Flag=6在Flag为Varchar时前者使用索引,后者不使用索引。这就要求我们将传给QueryBuilder的参数的类型转换得和数据库中的一致,非参数化where条件中的Varchar类型则要注意加单引号。
2. 右like会使用索引,例如ClassInnerCode like '0000001%',但左like不会,例如ClassInnerCode like '%000001'不使用索引。
3. 不等于不会使用索引,例如Flag<>'5'不使用索引。
4. Mysql的limit分页有缺陷,越到后面的页越慢。
5. 在没有Order by子句时,Flag in ('6','8')和Flag='6' or Flag='8'会使用索引,但有Order by时实际上索引不生效。
6. 复合索引(A,B,C)相当于单独索引(A)+复合索引(A,B)+复合索引(A,B,C),即在查询时Mysql会使用复合索引的前面部分的字段。便如索引(Flag,ClassType,ClassInnerCode),会在条件不Flag='6'时起作用,也会在Flag='6' and ClassType='1'时起作用,在Flag='6' and ClassType='1' and ClassInnerCode like '000001'时也起作用。但不会在Flag='6' and ClassInnerCode like '000001'时起作用。这个意味着如果有两个索引(Flag)和(Flag,ClassType),则(Flag)是多余的。
7. 可以在sql之前加explain来得到SQL的执行计划,例如explan select * from zcarticle。执行计划会列出是否使用索引,使用什么样的索引。特别要注意的是Extra段,如果出现了FileSort,则性能会极差,需要立即调整。
|
所有评论仅代表网友意见