|
|
51CTO旗下网站
|
|
移步端
  • 上班中遇到的99%SQL多极化,此地都能送你解决方案

    明天几篇文章介绍了mysql的底色数据结构和mysql多极化的神器explain。看台有些朋友说小强只介绍概念,平日利用还是一面懵,众目睽睽要求小强来一篇实战sql多极化,历经周末两角的整治和总结,sql多极化实战新鲜出炉, 大家平时求学和工作中,赶上的90% 的sql多极化都会介绍到,介意篇幅过长,人均3篇文章哈。

    笔者:小强之进阶之路 来源:当日第一| 2019-12-02 13:36

    上班中遇到的99%SQL多极化,此地都能送你解决方案

    明天几篇文章介绍了mysql的底色数据结构和mysql多极化的神器explain。看台有些朋友说小强只介绍概念,平日利用还是一面懵,众目睽睽要求小强来一篇实战sql多极化,历经周末两角的整治和总结,sql多极化实战新鲜出炉, 大家平时求学和工作中,赶上的90% 的sql多极化都会介绍到,介意篇幅过长,人均3篇文章哈。

          
    1. CREATE TABLE `employees` ( 
    2.  `id` int(11) NOT NULL AUTO_INCREMENT, 
    3.  `namevarchar(24) NOT NULL DEFAULT '' COMMENT '姓名'
    4.  `age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄'
    5.  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位'
    6.  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间'
    7.  PRIMARY KEY (`id`), 
    8.  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE 
    9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='职工表'
    10. insert into employees(name,age,position,hire_time) values('LiLei', 22, 'manager', NOW()) 
    11. insert into employees(name,age,position,hire_time) values('HanMeimei', 23, 'dev', NOW()) 
    12. insert into employees(name,age,position,hire_time) values('Lucy', 23, 'dev', NOW()) 

    全值匹配

    目录的字段类型是varchar(n):2字节存储字符串长度,如果是utf-8, 则长是3n+2

          
    1. EXPLAIN select * from employees where name='LiLei'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

          
    1. EXPLAIN select * from employees where name='LiLei' AND age = 22; 
    上班中遇到的99%SQL多极化,此地都能送你解决方案

           
    1. EXPLAIN select * from employees where name='LiLei' AND age = 22 AND position = 'manager'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    最左前缀法则

    如果索引是多列,要最受最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。以下三枝sql根据最左前缀法则,都不会走索引。

          
    1. EXPLAIN select * from employees where age = 22 AND position='manager'
    2. EXPLAIN select * from employees where position ='manager'
    3. EXPLAIN select * from employees where age=17; 
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    目录失效

    无需在索引列上做其他操作(计算、函数、品种转换),会导致索引失效而转向全表扫描。

          
    1. EXPLAIN select * from employees where name='LiLei'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  
          
    1. EXPLAIN select * from employees where left(name, 3)='LiLei'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    送hire_time增长一个寻常索引:

          
    1. alter table `employees` ADD INDEX `idx_hire_time`(`hire_time`) USING BTREE; 
    2. EXPLAIN select * from employees where date(hire_time) = '2019-08-25'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    还原最初索引状态

          
    1. ALTER TABLE `employees` DROP INDEX `idx_hire_time`; 

    存储引擎不能采取索引中范围条件右边的进

          
    1. -- EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager'; 
    2. EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age>22 AND position ='manager'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    观看key_len其一索引长度是78, 也就是只使用到了明天两个字段name和age,postition没有使用到索引的。

    覆盖索引

    尽量使用覆盖索引(只访问索引的询问(目录列包含查询列)),调减selelct * 说话。

          
    1. EXPLAIN SELECT name,age,position FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    谱判断

    mysql在采取不等于(! = 或者 <>)的时节无法运用索引会导致全表扫描

          
    1. EXPLAIN SELECT * FROM employees WHERE name !='LiLei' ; 
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    空值判断

    is null,is not null也无从运用索引

          
    1. EXPLAIN SELECT * FROM employees WHERE name is null
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    like

    like以通配符开头(‘$abc’)mysql目录失效会变成全表扫描操作

          
    1. EXPLAIN SELECT * FROM employees WHERE name LIKE '%Lei'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    字符串不加单引号索引失效

          
    1. EXPLAIN SELECT * FROM employees WHERE name ='1000'
    2. EXPLAIN SELECT * FROM employees WHERE name =1000; 
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    不加单引号的字符串,mysql底层会使用cust函数将他转换为字符串,此刻索引失效。

    or&in丢掉使用

    少用or或in,用他查询时,mysql不一定使用索引,mysql其间优化器会根据索引比例、表面大小等多个因素整体评估是否采取索引。

          
    1. EXPLAIN SELECT * FROM employees WHERE name ='LiLei' or name='HanMeimei'
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    规模查询优化

    送年龄添加单值索引

          
    1. ALTER TABLE `employees`ADD INDEX `idx_age`(`age`) USING BTREE; 
    2. EXPLAIN select * from employees where age > 1 and age <= 2000; 
    上班中遇到的99%SQL多极化,此地都能送你解决方案  

    没有走索引原因:mysql其间优化器会根据检索比例、表面大小等多个因素整体评估是否采取索引。其一例子没有走索引可能是因为单次数据量查询过大导致优化器最终摘取不走索引。多极化方法:可以将大的框框拆分成多个小规模。

    【编纂推荐】

    1. 详解Oracle必发娱乐登录的三大索引类型
    2. 10款好用之MySQL GUI工具,必发娱乐登录管理员的好帮手
    3. 记一次生产条件必发娱乐登录连接超时自动回收问题及解决办法
    4. 分享一份MySQL一键优化脚本,值得收藏
    5. 一文看懂SQL Server必发娱乐登录触发器概念、原理及案例
    【义务编辑: 庞桂玉 TEL:(010)68476606】

    点赞 0
  • SQL  SQL多极化  必发娱乐登录
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    Devops的监控神器Prometheus

    Devops的监控神器Prometheus

    监督主流
    共22章 | 小罗ge11

    55人口订阅学习

    手把手玩转Elasticsearch

    手把手玩转Elasticsearch

    Chandler_珏瑜
    共20章 | Chandler_珏瑜

    76人口订阅学习

    传感器选型从入门到实战

    传感器选型从入门到实战

    政务云规划设计实战
    共16章 | 51CTOsummer

    570人口订阅学习

    读 书 +更多

    最佳网管员――网络设备

    该书深入细致地介绍了用于构建网络的最重要的软件设备――成像机、玉器、安全装置和输油管线设备,涵盖了原理、数、列入、租用、计划、接口...

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微

    
       
       
       
       
  •