SQL优化规则_04_Argument相关 - 02

避免使用模式匹配

  • 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);
    原文作者:在水一方_Eric
    原文地址: https://www.jianshu.com/p/cdaf1aea02db
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞