1.hash索引
CREATE TABLE `testhash` (
`fname` varchar(50) DEFAULT NULL,
`lname` varchar(50) DEFAULT NULL,
KEY `fname` (`fname`) USING HASH
) ENGINE=MEMORY;
为什么用MEMORY存储引擎,因为mysql只有MEMORY存储引擎显示支持哈希索引。 看如下查询:
select lname from testhash where fname ='Peter'
Mysql首先计算Peter的哈希值是8784,然后到哈希索引中找到对应的行指针,根据指针找到对应的数据行。 索引只存储哈希码及行指针,所以索引的数据结构非常的紧凑,这也让哈希索引查找速度非常快,但是哈希索引也有他的限制。
注:是不是和MISIAM存储引擎很相似,都是索引和数据分开的。
2.innodb默认不支持哈希索引
只能说一般是InnoDB自己在优化的过程中,才会自动的创建一张表来生成哈希索引。
3.优点和缺点
4.聚集索引和非聚集索引
-
概念:什么是聚集索引,什么是非聚集索引? 主要出发点:是要看索引的排列顺序和表记录的排列顺序是否一致,因为对于InnoDB存储引擎来说,其主要是B+树,而B+树的数据结构中,存储的索引+数据,同时保证了排列顺序的一致,所以是聚集索引,而MySIAM是非聚集索引。 -
聚集索引: 主键索引:在结构中同时保留了主键key+行记录 .ibd结构 (数据就这一份) 辅助索引:在结构中为辅助键的key + 主键的key (这是什么结构?不知道) 回表:所以对于辅助索引一般会有回表操作,但是对于索引覆盖可以避免回表,情形如下: select age from employee where age < 20
-
非聚集索引 主键索引:在结构中保存的是主键key + 行记录的地址 .myd .myi(本质:数据和索引分离) 辅助索引:结构和主键索引一样
5.常见的索引
- 主键索引(唯一为空)
- 如果定义了主键,那么InnoDB会使用主键作为聚簇索引
- 如果没有定义主键,那么会使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作为聚簇索引
- 如果既没有主键也找不到合适的非空索引,那么InnoDB会自动生成一个包含了ROW_ID值的列作为聚簇索引,行都会根据这个ROW_ID排序。
- 注:没有主键的结果
很明显,缺少主键的表,InnoDB会内置一列用于聚簇索引来组织数据。而没有建立主键的话就没法通过主键来进行索引,查询的时候都是全表扫描,小数据量没问题,大数据量就会出现性能问题。 - 唯一索引
就是唯一值的列建立的索引 - 普通索引
不涉及唯一+非空
6.哪些需要创建索引?哪些不需要创建索引?
- 需要创建索引
- 1.经常查询的字段可以加快速度
- 2.主键(默认聚簇索引)
- 3.where中常用的列字段
- 4.在经常需要排序的列上加索引,**因为本身索引查出来就是有序的,**所以会加快速度
- 5.在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
- 哪些不需要创建索引
- 1.查询中很少使用的字段
- 2.对于那些定义为text, image和bit数据类型的列不应该增加索引:这是因为,这些列的数据量要么相当大,要么取值很少。 取值大,索引很复杂,取值小,建立不出什么东西。
- 3.对于那些只有很少数据值的列也不应该增加索引,因为在查询的时候会涉及到很大数据行的,并且涉及到回表,所以不一定很快。
7.联合索引以及最左匹配原则?
- MySql使用索引时需要索引有序,假设现在建立了“name,age,school”的联合索引。
- 那么索引的排序为从左到右:先按照name排序,如果name相同则使用age排序,如果age也相等则使用school排序。
- 原则:建立联合索引的时候要把查询频繁的字段放在前面。
8.如何查看创建的索引有没有被使用到?
- 命令:explain
- 分析:type字段
- all、range、ref(该索引列的值并不唯一)、ref_eq(使用了索引,并且值唯一)、const(主键放在where后)
9.索引失效原则?
- 使用不等<>= 查询
- 不符合最左匹配原则
- 联合索引,使用范围查找,后面的部分
- like字段 like"%a",最左边是通配符
- mysql优化器本身分析出不走索引快的时候
- 索引列进行操作(表达式运算/分组函数)
10.索引的优缺点?
- 优点:加快查询的速度
- 缺点:数据的写入过程会涉及到索引的更新,也就是索引的维护
- 1.节点的插入:主要涉及到节点的分裂,当然还有节点索引值的修改
- 2.节点的删除:主要涉及到节点的合并,当然还有索引值的修改
https://cloud.tencent.com/developer/article/1692119 https://blog.csdn.net/doctor_who2004/article/details/77414742 https://www.nowcoder.com/discuss/389444?type=post&order=time&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack
|