MySQL索引

本文介绍了MySQL索引的基本概念,包括其优势和劣势。详细阐述了不同类型的索引,如单值、唯一和复合索引,以及全文索引。讨论了如何创建、删除和查看索引,并解释了如何通过EXPLAIN分析索引使用。此外,还探讨了何时应该创建索引和不适合创建索引的情况,以及索引的内部结构和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引
1、什么是索引
1、索引用于快速找出在某个列中有一特定值的行,
2、不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,
3、表越大,查询数据所花费的时间就越多,
4、如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,
5、而不必查看所有数据,那么将会节省很大一部分时间

2、索引的优势与劣势
1、优势
类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
2、劣势
实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。
虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。
 
3、索引的分类
1、单值索引
即一个索引只包含单个列,一个表可以有多个单列索引。
2、唯一索引
索引列的值必须唯一,但允许有空值。
3、复合索引
一个索引包含多个列。
INDEX MultiIdx(id,name,age)
4、全文索引
只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引

4、索引操作
1、创建索引

CREATE INDEX 索引名称 ON table (column[, column]...);
   create INDEX salary_index ON emp(salary)

2、删除索引

DROP INDEX 索引名称 ON 表名

3、查看索引

show index from 表名;

解释:
* Table
表名
Non_unique
如果索引不能包括重复词,则为0。如果可以,则为1。
Key_name
索引的名称
Seq_in_index
索引中的列序列号,从1开始。
Column_name
列名称。
Collation
列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
Cardinality
索引中唯一值的数目的估计值。
过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型
表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。
Sub_part
如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
Packed
指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null
如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type
用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment
索引备注信息*

4、自动创建索引
(1)在表上定义了主键时, 会自动创建一个对应的唯一索引
(2)在表上定义了一个外键时,会自动创建一个普通索引

5、EXPLAIN
作用:用来查看索引是否正在被使用,并且输出其使用的索引的信息。
解释:
id: 
SELECT识别符。这是SELECT的查询序列号,也就是一条语句中,该select是第几次出现。在次语句中,select就只有一个,所以是1.
select_type:
所使用的SELECT查询类型,SIMPLE表示为简单的SELECT,不实用UNION或子查询,就为简单的SELECT。
table
数据表的名字。他们按被读取的先后顺序排列
type
指定本数据表和其他数据表之间的关联关系,该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。
key
实际选用的索引
possible_keys
MySQL在搜索数据记录时可以选用的各个索引,该表中就只有一个索引,year_publication
key_len
显示了mysql使用索引的长度(也就是使用的索引个数),当 key 字段的值为 null时,索引的长度就是 null。注意,key_len的值可以告诉你在联合索引中mysql会真正使用了哪些索引。这里就使用了1个索引,所以为1,
ref:
给出关联关系中另一个数据表中数据列的名字。常量(const),这里使用的是1990,就是常量。
rows
MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。
extra
提供了与关联操作有关的信息,没有则什么都不写。 
 
 
6、索引结构
1、先会对数据进行排序
2、btree索引
(1)B+树索引
(2)B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。

3、hash索引
(1) 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
(2) hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

7、哪些情况需要创建索引
1、主键自动建立唯一索引
2、频繁作为查询条件的字段应该创建索引
3、查询中与其他表关联的字段,外键关系建立索引
4、频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
5、WHERE条件里用不到的字段不创建索引
6、查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
7、查询中统计或者分组字段

8、哪些情况不需要创建索引
1、表记录太少
2、经常增删改的表
3、如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果

MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全扫描。可以使用OPTIMIZE TABLE命令来优化索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员张礼奎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值