避免使用模式匹配
- Content:性能问题是使用模式匹配操作符的最大缺点。使用LIKE或正则表达式进行模式匹配查询的另一个问题,是可能会返回意料之外的结果。最好的方案就是使用特殊的搜索引擎技术来替代SQL,比如Apache Lucene。另一个可选方案是将结果保存起来从而减少重复的搜索开销。如果一定要使用SQL,请考虑在MySQL中使用像FULLTEXT索引这样的第三方扩展。但更广泛地说,您不一定要使用SQL来解决所有问题。
- Case:
select c_id,c2,c3 from tbl where c2 like 'test%'
OR查询索引列时请尽量使用IN谓词
- Content:IN-list谓词可以用于索引检索,并且优化器可以对IN-list进行排序,以匹配索引的排序序列,从而获得更有效的检索。请注意,IN-list必须只包含常量,或在查询块执行期间保持常量的值,例如外引用。
- Case:
SELECT c1,c2,c3 FROM tbl WHERE c1 = 14 OR c1 = 17
引号中的字符串开头或结尾包含空格
- Content:如果VARCHAR列的前后存在空格将可能引起逻辑问题,如在MySQL 5.5中’a’和’a ‘可能会在查询中被认为是相同的值。
- Case:
SELECT 'abc '
不要使用hint,如sql_no_cache, force index, ignore key, straight join等
- Content:hint是用来强制SQL按照某个执行计划来执行,但随着数据量变化我们无法保证自己当初的预判是正确的。
- Case:
SELECT * FROM t1 USE INDEX (i1) ORDER BY a;
不要使用负向查询,如:NOT IN/NOT LIKE
- Content:请尽量不要使用负向查询,这将导致全表扫描,对查询性能影响较大。
- Case:
select id from t where num not in(1,2,3);