mysql聚合索引失效
索引是可以高效的获取数据的数据结构, 对查询有很大作用. 索引对于数据库, 就像偏旁部首, 或者26个英文字母对于字典一样, 能很快的提高查询速度.但是索引也有它的缺点:首先就是占用磁盘空间其次是虽然...
2024.11.21索引字段的维护是有代价的,所以在建立冗余索引来支持覆盖索引时就需要权衡业务的需求,不能盲目来。
1 前缀索引如果为每一种查询都设计一个索引,索引也就太多了,如我们再多一个根据用户身份证号来查看他的姓名或者是地址,这个查询需求在业务中出现的概率不高,每次查询时让它走全表扫描也是可以的,但这也太low了,数据量一上百万级别,人眼感觉的慢。
所以可以使用 索引的“最左前缀” 来定位记录。
如上图所示,索引项是按照索引定义里面出现的字段顺序排序的,当需要查到所有名字是“张三”的人时,可以快速定位到 ID为1001的位置,然后向后遍历得到所有需要的结果。
当你的查询是模糊查询时,也能够用上图这个索引,查找到第一个符合条件的记录是 ID为1001的位置,然 后向后遍历,直到不满足条件为止。
select * from t_user where name like ‘张 %‘这样看来,只要是查询的条件满足满足联合索引的最左前缀,就可以利用索引来加速检索,这个最左前缀可以是联合索引的最左 N 个字段,可称作是前缀索引。
基于联合索引的使用,在建立联合索引的时候,如何安排索引内的字段顺序便是一个效率的关键点,一个参考的原则就是
索引的复用能力: 当有了 (a,b) 这个联合索引后,一般就不需要单独在 a 上建立索引了,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
如在这里我们创建的 ‘name_age’ ,从空间的角度来看,name 字段是比 age 字段大的 ,所以我们创建一个(name,age) 的联合索引和一个 (age) 的单字段索 引。
2 索引下推如在这里 t_user 表的 (name,age) 的联合索引,当执行如下查询筛选时
select * from t_user where name like ‘张 %‘ and age=20首先会使用(name,age) 的联合索引的 前缀索引规则找到第一个满足条件的ID为1001,然后一个个回表到主键索引上找出数据行,如下图所示:
在这个过程 InnoDB 并不会去看 联合索引表age 的值,只是按顺序把“name 第一个字是’张’的记录一条条取出来回表,因此查询出来三条数据, 需要回表 4 次。
MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过 程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数,如下图所示
在这个过程中InnoDB 在 (name,age) 索引内部就判断了 age 是否等于 20,对于 不等于 20 的记录,直接判断并跳过,在查询中,只需要对 ID-1001、ID-1011 这两条记 录回表取数据判断,查询三条数据,就只需要回表 2 次。
完毕
不局限于思维,不局限语言限制,才是编程的最高境界。
索引是可以高效的获取数据的数据结构, 对查询有很大作用. 索引对于数据库, 就像偏旁部首, 或者26个英文字母对于字典一样, 能很快的提高查询速度.但是索引也有它的缺点:首先就是占用磁盘空间其次是虽然...
2024.11.21在设计MySQL索引时,需要考虑以下八大原则:最左前缀原则:复合索引按照从左到右的顺序进行匹配,如果查询条件中包含了复合索引的最左侧的列,则该索引会被使用。选择性原则:索引的选择性越高,即不同值之间的...
2024.11.20一、具体使用Navicat添加前缀索引的方法如下图,给test表中的name列添加前缀索引图一如下图,点击索引,输入合适的子部分值图二二、什么是前缀索引?所谓前缀索引,说白了就是对文本的前几个字符建立...
2024.11.21没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储1...
2024.11.20一、索引优化:1、like语句的前导模糊查询不使用索引:select * from doc where title like ‘%XX‘; --不能使用索引select * from doc wher...
2024.11.21