Mysql中的联合索引、前缀索引、覆盖索引

索引

索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

联合索引

又名复合索引,由两个或多个列的索引。它规定了mysql从左到右地使用索引字段,对字段的顺序有一定要求。一个查询可以只使用索引中的一部分,更准确地说是最左侧部分(最左优先)。如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

CREATE TABLE test(a INT, b INT, c INT, KEY(a, b, c));
  • 1

前缀索引

对于列的值较长,比如BLOB、TEXT、VARCHAR,就必须建立前缀索引,即将值的前一部分作为索引。这样既可以节约空间,又可以提高查询效率。但无法使用前缀索引做 ORDER BY 和 GROUP BY,也无法使用前缀索引做覆盖扫描。

 # 语法
 ALTER TABLE table_name ADD KEY(column_name(prefix_length));
 # 示例
 ALTER TABLE city ADD KEY(cityname(7))
  • 1
  • 2
  • 3
  • 4

覆盖索引

跟联合索引有点类似,就是在查询t的时候只用去读取索引而取得数据,无需进行二次查询相关表。这样的索引的叶子节点上面也包含了他们索引的数据。

判断标准:使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。

原文地址:https://www.cnblogs.com/hadley/p/9498742.html

时间: 2024-11-10 00:57:29

Mysql中的联合索引、前缀索引、覆盖索引的相关文章

Mysql性能优化:为什么要用覆盖索引?

原文:Mysql性能优化:为什么要用覆盖索引? 导读 相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗? 本篇文章将从MYSQL内部结构上讲一下为什么覆盖索引能够提升效率. InnoDB索引模型 在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表.又因为前面我们提到的,InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的. 每一个

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引 今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int a

SQL Server中的联合主键、聚集索引、非聚集索引

我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我们依然可以通过对联合主键中的首列除外的其他列建立非聚集索引来提高性能.本文将对联合主键.聚集索引.非聚集索引对查询性能的影响举例说明.步骤一,建立一个测试表,并且插入350万条以上的数据. /*创建测试数据表*/create table MyTestTable(id varchar(10)not n

mysql中生成列与JSON类型的索引

MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle(sidea, sideb) VALUES(3,4),(6,8),(5,12); mysql> select * from triangle;

在Mysql中遇到关于区间范围内的索引优化

上次调优Mysql 的时候,发现有些语句并没有用到索引,这引起了我的注意,发现在大数据量的情况下,由于数据的不同,会导致索引策略的更改! 通过explain命令进行查看发现结果数据过大的话type会变为index. 索引应该尽可能减少区间范围,减少结果. PS:在昨天的sql'研究中,还发现如果是select * from xxx where lat>xx and lat <xx and lng>xxx and lng <xxx更正为 select * from xxx where

MySQL性能优化:MySQL中的隐式转换造成的索引失效

数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很小的疏忽造成的,又或者是因为不了解某个技术特性产生的. 于数据库层面,最常见的恐怕就是索引失效了,且一开始因为数据量小还不易被发现.但随着业务的拓展数据量的提升,性能问题慢慢的就体现出来了,处理不及时还很容易造成雪球效应,最终导致数据库卡死甚至瘫痪.造成索引失效的原因可能有很多种,相关技术博客已经有

mysql中的联合查询

一.基本语法 select 语句1 -- 所有select语句获取的字段数必须一致,与类型无关. union [union选项] -- 与select选项相同, all(全部保留) 和 distinct (去重), 不同的是,默认值为distinct. select 语句2 union...; 二.作用 1. 以不同的需求查询同一张表.如:查询学生信息,男生按年龄升序排序,女生按年龄降序排序. (select * from 表名 where sex = '男' order by age limi

mysql中的联合查询(内联、左联、外联、右联、全联)

联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join .全联full outer join 的好处及用法. 联合查询效率较高,以下例子来说明联合查询(内联.左联.右联.全联)的好处: T1表结构(用户名,密码) userid(int) usernamevarchar(20) password varchar(20) 1 jack jackpwd 2 owen owenpwd T2表结构(用户名,密码) us

一步一步带你入门MySQL中的索引和锁 (转)

出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结构. InnoDB的索引结构 在InnoDB中是通过一种多路搜索树——B+树实现索引结构的.在B+树中是只有叶子结点会存储数据,而且所有叶子结点会形成一个链表.而在InnoDB中维护的是一个双向链表. 你可能会有一个疑问,为什么使用 B+树 而不使用二叉树或者B树? 首先,我们知道访问磁盘需要访问到