MysqlInnoDB引擎在查询优化方面非常弱,因此需要一些注意事项:

1. where条件中的字段类型和数据库中的字段类型不一致时,不会使用索引。例如Flag='6'Flag=6FlagVarchar时前者使用索引,后者不使用索引。这就要求我们将传给QueryBuilder的参数的类型转换得和数据库中的一致,非参数化where条件中的Varchar类型则要注意加单引号。

2. like会使用索引,例如ClassInnerCode like '0000001%',但左like不会,例如ClassInnerCode like '%000001'不使用索引。

3. 不等于不会使用索引,例如Flag<>'5'不使用索引。

4. Mysqllimit分页有缺陷,越到后面的页越慢。

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,则性能会极差,需要立即调整。