zoukankan      html  css  js  c++  java
  • sql 优化

    参考文献:https://www.cnblogs.com/yunfeifei/p/3850440.html
    mysql  <,<=,=,>,>=,BETWEEN,IN,LIKE ‘aaa%’才会使用索引。
    /**
    表说明 人员表 字段涉及 id 分数 firstName,laseName
    注意:对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
    SQL最后的注释表示执行计划中Type字段
    */
    --null 测试 
    EXPLAIN SELECT * FROM USER100w WHERE LAST_NAME IS NOT NULL;-- all
    EXPLAIN SELECT * FROM USERNOINDEX WHERE LAST_NAME IS NOT NULL;--all
    
    --<> != 测试 尽量避免使用 <> 或 != 这种骚操作
    EXPLAIN SELECT * FROM USER100w WHERE id <> 100000; -- range
    EXPLAIN SELECT * FROM USERNOINDEX WHERE id <> 100000; -- all
    
    -- or测试 如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
    EXPLAIN SELECT * FROM USER100w WHERE id=1 OR score =93 ; -- index_merge
    EXPLAIN SELECT * FROM USER100w WHERE sex = 0 OR first_name ='9'; -- all
    
    
    -- in 和 not in 也要慎用,否则会导致全表扫描 
    --验证:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况
    --EXISTS 的原理是对外表进行loop 循环,所以外表要小才用
    --而in 的原理类似hash 所以当内表小才使用
    EXPLAIN SELECT * FROM USER100w WHERE id IN (1,2,3) ; -- range
    EXPLAIN SELECT id FROM USER100w WHERE EXISTS (SELECT id FROM USER100w WHERE id BETWEEN 1 AND 3 ); -- range
    
    ---不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
    如:
    EXPLAIN SELECT * FROM USER100w WHERE score/2 = 42 ; --all
    EXPLAIN SELECT * FROM USER100w WHERE score = 42*2 ; --ref
    
    --应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
    EXPLAIN select id from USER100w where substring(last_name,1,3) = 'abc'; 
    
    --测试like 有匹配做索引但type 还是all
    EXPLAIN select * from USER100w where score like '%abc'; --all
    EXPLAIN select * from USER100w where score LIKE 'abc%'; --all
    EXPLAIN select * from USER100w where score like '%abc%'; --all
    
    /**在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引
    ,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致
    */ /** 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,
    因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个
    ,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
    */ --如果字段是数值类型尽量使用数值而不是使用字符串,因为数据库在链接查询的时候会对字符串进行循环比较每一个字,数值只会比较一次 --任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。 --Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。
  • 相关阅读:
    2021.1.18 HTML标签及元素
    嵌入式发展史简述及一些概念
    06 突破512字节的限制 上
    50 排序的工程应用示例
    01 进阶操作系统
    05 主引导程序的扩展-下
    04 主引导程序的扩展-上
    03 调试环境的搭建
    在windows下使用linux命令,GnuWin32的使用.
    gcc -I -L -l区别
  • 原文地址:https://www.cnblogs.com/lanSeGeDiao/p/10678043.html
Copyright © 2011-2022 走看看