前言概述
最近在找工作,mysql因为是项目主要用到的数据库,但由于平时只注重业务需求,而且数据库操作只停留在表皮上的增删改查,面试时根本不够用。怎么办?没办法啊!! 只能恶补了,不求啥啥都会,但是索引这块必须的要有一个大体的了解。找了很多资料,感觉都是大牛,我就还是选择搬运吧,O(∩_∩)O哈哈~
索引概念
索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。
索引原理
通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
从上面的描述中可以看出索引主要做两件事:排序 + 查找
如何创建索引
1 #方法一:创建表时
2 CREATE TABLE 表名 (
3 字段名1 数据类型 [完整性约束条件…],
4 字段名2 数据类型 [完整性约束条件…],
5 [UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
6 [索引名] (字段名[(长度)] [ASC |DESC])
7 );
8
9
10 #方法二:CREATE在已存在的表上创建索引
11 CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
12 ON 表名 (字段名[(长度)] [ASC |DESC]) ;
13
14
15 #方法三:ALTER TABLE在已存在的表上创建索引
16 ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
17 索引名 (字段名[(长度)] [ASC |DESC]) ;
18
19 #删除索引:
20 DROP INDEX 索引名 ON 表名字;
创建索引需要遵循哪些原则
- 搜索的索引列,不一定是查询列,最适合创建索引的列是跟在where条件中的列;
- 使用唯一索引,列中的数值差异越大越明显,记录性别的字段,只包含两种情况,对其创建索引没有多大用途;
- 尽量使用短索引;
- 如果数据频繁的更新或删加,就不宜建立索引
什么情况下索引会失效
- like '%xx'
select * from tb1 where email like '%cn'; - 使用函数
select * from tb1 where reverse(email) = 'wupeiqi'; - or
select * from tb1 where nid = 1 or name = 'seven@live.com'; - 类型不一致
如果列是字符串类型,传入条件是必须用引号引起来
select * from tb1 where email = 999; - 组合索引最左前缀
如果组合索引为:(name,email)
name and email -- 使用索引
name -- 使用索引
email -- 不使用索引 - 没有查询条件,或者查询条件没有建立索引;
- 对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响
普通索引: 允许被索引的数据列包含重复的值。
唯一索引: 唯一索引可以保证数据记录的唯一性。
主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY 来创建。
联合索引:覆盖多个数据列。
正确使用索引可以提高查询效率,但由于建立索引需要占用物理空间,当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。所以建立索引前要考虑。
B+ Tree索引和Hash索引有哪些区别
存储格式上,Hash使用key-value形式;b+tree是多路平衡二叉树。
哈希索引适合等值查询,但是无法进行范围查询
哈希索引没办法利用索引完成排序
哈希索引不支持多列联合索引的最左匹配规则
b+tree的叶子节点都能存什么
直接存放数据的,叫聚簇索引。
存放主键,叫非聚簇索引。
聚簇索引和非聚簇索引区别
1、聚簇索引:
将数据存储与索引放到了一块,找到索引也就找到了数据将数据存储与索引放到了一块,找到索引也就找到了数据。
a) 一个索引项直接对应实际数据记录的存储页,可谓“直达”
b) 主键缺省使用它
c) 索引项的排序和数据行的存储排序完全一致,利用这一点,想修改数据的存储顺序,可以通过改变主键的方法(撤销原有主键,另找也能满足主键要求的一个字段或一组字段,重建主键)
d) 一个表只能有一个聚簇索引(理由:数据一旦存储,顺序只能有一种)
2、非聚簇索引:
将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。
a) 不能“直达”,可能链式地访问多级页表后,才能定位到数据页
b) 一个表可以有多个非聚簇索引
mysql中聚簇索引的设定
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。
文章引用
https://www.cnblogs.com/Eva-J/articles/10126413.html
他讲的非常全面,我这里只针对面试常问的点做总结,如果要更深入的理解索引,还需要了解很多数据结构,计算机基础方面的知识。我们还很年轻,年轻就得学啊!!