1、mysql的子查询实现的很烂,会发生不使用索引的问题,据官方说6以后会改善。
例如:select * from ol_question where questionid in (select questionid from ol_questiontag)
正常应该是查询完ol_questiontag中的questionid后在通过索引查询ol_question 中数据,但是通过explain下的观察在查询ol_question 时竟然没有利用到主键索引,大bug。。。
2、explain和profiling是查询优化的好助手。
3、索引的一个最大好处是在排序的时候。而且group的时候也可以享受到。但是切记不可对同一字段进行两次排序,教训啊。在最近对试题查询进行优化的时候(最后发现是因为数据传输而不是查询慢…)发现同事存在一个误区,给一些枚举字段建索引,这样的索引没有意义唯一性太低的字段不适合建索引。具体原因参考数据库索引的机制。而且据说数据库只会使用一个索引?!
4、避免过于面向对象导致N+1问题,如试题查询曾经遇到的问题。
5、join的优化
查了些资料,mysql在join时是使用nested loop join,也就是说在join表时是用驱动表作为结果集到其他表中进行循环,并且合并结果集,知道这样的思路也就知道了应该注意的地方:也就是以小结果集来驱动大结果集,这样可以提高性能。而且要注意给join的字段加索引。
6、对表中大字段的处理
现在所做的项目中试题表由于题目内容较大,查询就应该分场景进行,仅在需要的时候去读取大字段的内容,这样可以减少网络传输,甚至可以考虑分表进行存储,这样可以减少查询时数据库读取大字段,而且据说除非在索引中完成的查询,否则即使查询其他字段,数据库在查询时候也会去读取大字段(待验证)。
(待续…)