首页 > 数据库 >mysql 调优-索引失效

mysql 调优-索引失效

时间:2023-05-17 16:11:51浏览次数:28  
标签:... name -- age 索引 调优 mysql where

范围条件放最后面,不管单列还是多列索引,把能过滤最多的索引放前面

  • 用不用索引最终都是优化器决定的,EXPLAIN json 格式里的执行成本决定

  • 最左匹配,如果是联合索引,查找索引树的时候,只能根据第一个索引才能找到第二个第三个,如果顺序没对就不会走索引

-- 联合索引(name, code, addr)
-- 这个虽然顺序没对,但是三个字段都用上了,优化器会给我们换 where 顺序,所以会走索引
select * from t_user where name ... and addr...and code...

-- 这个会走一半,可以根据 EXPLAIN 看其 key_length
-- 因为 name 是联合索引第一个,所以 name 会走索引,但是第二个索引是 code,这里跳过了 code,所以后面的 addr 不会走索引
select * from t_user where name... and addr...

-- 不会走索引,跳过了第一个
select * from t_user where code... and addr...

-- 会走索引
select * from t_user where name... 
  • 计算,函数,类型转换(自动会手动)导致索引失效
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE age+1 = 20;
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name=123;
  • 范围条件右边的列索引会失效(不是where条件的右边,是联合索引的右边)
-- 联合索引 age,name
-- age 会走索引
select * from t_user where age > 18 and name = 'xxx';

-- 联合索引与where位置无关(优化器会优化),结果还是 age 会走索引,name 不会
-- 优化器优化后的sql是 ... where age > 18 and name = 'xxx'
-- 如果真要这样干,那就再建立个联合索引 name, age
select * from t_user where name = 'xxx' and age > 18;
  • 不等值查询不会走索引,where name <> xxx

  • is not null 不会走索引(is null 会走,所以建议列约束设置为不为空)

  • like % 开头不走索引

  • or 前后存在非索引列不走索引,除非所有的 or 列都有索引

标签:...,name,--,age,索引,调优,mysql,where
From: https://www.cnblogs.com/hangychn/p/17409102.html

相关文章

  • [MySQL事务一文搞懂]
    [MySQL事务一文搞懂]1、什么是事务?事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部执行,要么全部不执行。2、为什么需要事务把一系列sql放入一个事务中有两个目的:为数据库操作提供了一个......
  • MySQL回表 索引覆盖02
    资料来源:  https://zhuanlan.zhihu.com/p/401198674?utm_id=0  ......
  • mysql 调优-利用索引覆盖和下推
    回表只查询一次索引得不到想要的数据,典型的场景就是非聚簇索引查询:先拿到主键ID,再根据id查询一次得到数据(再次查询这就是回表)索引覆盖:根据普通索引查询不回表就能得到数据--联合索引(age,addr)selectage,addrfromt_userwhereage>10;--单列索引(不一定非要联合索引......
  • mysql 事务与隔离级别
    ACIDAtomicity:原子性(UNDOLOG实现),一组操作要么都成功,要么都失败Consistency:一致性(UNDOLOG实现),从一个合法状态变为另一个合法状态(语义上不是语法上)。比如转账之后余额为负数,虽然也能守恒,但是明显不合法。或者转账时A账户钱少了,B账户钱没多,也是不合法的Isolation:隔离性(锁机制实......
  • mysql 锁机制
    表锁:InnoDB支持行锁,不代表着就不支持表锁表锁的S和X锁,MyISAM的锁(不建议在InnoDB中使用)--查看当前有表锁的表showopentableswherein_use>0;--给表加S锁(所有事务都能读,所有事务都不能写)locktablestable_nameread;--给表加X锁(拿到锁的事务可写可读......
  • mysql 底层数据存储结构
    内存和磁盘每次交互都是完整的页,数据页里面存放的是行(不仅仅是数据库的数据行,还有行格式等)页(16k,计算机与内存的最小单位)的上层单位还有区(一个区存放64个页,64*16k=1024k,刚好1M),区上面是段(一个或多个区组成),段上面是表空间(一个或多个段组成)行格式showtablestatuslike't_u......
  • docker 部署nacos单机版并配置mysql支持
    1.配置mysql数据库选用mysql5.7表名为nacos_config,附上建表SQLSETNAMESutf8mb4;SETFOREIGN_KEY_CHECKS=0;--------------------------------Tablestructureforconfig_info------------------------------DROPTABLEIFEXISTS`config_info`;CREATETABLE......
  • springboot中使用application.properties配置mysql和sqlserver
    1.使用依赖*mysql:<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>*sqlserver:<dependency><groupId>com.microsoft.sqlserver</groupId><art......
  • mysql 存储引擎和索引
    存储引擎引擎特性文件InnoDB默认,支持事务,支持外键,支持行锁和表锁.frm文件存储表结构.ibd文件存储数据和索引MyISAM不支持事务,不支持外键,只支持表锁不支持行锁专门维护了一个常量保存每个表的总记录数(count很快)MyISAM强调的是性能,所以性能上优于InnoDB,但安全......
  • 文章索引
    本文用于对笔者所有博客的索引PS:点击文章名字可以跳转对应文章可以用Ctrl+F进行搜索学习笔记pytorch笔记conda常用命令算法案例基础算法:判断回文数函数P1320压缩技术(续集版)二分查找判断闰年已知日期求星期数据结构线性表二叉树......