MYSQL面试--索引(四)

-- 7.索引
-- 资料1:https://www.cnblogs.com/liqiangchn/p/9060521.html    --索引概念相关
-- 资料2:https://www.cnblogs.com/gdwkong/articles/8505125.html    -- 索引sql语法
-- 资料3:https://www.cnblogs.com/gdwkong/articles/8505125.html    -- 索引、explain分析
-- 资料4:https://www.cnblogs.com/s-b-b/p/8334593.html    -- 聚集索引和非聚集索引及优化
-- 资料5:https://blog.csdn.net/yangyu112654374/article/details/4251624    -- using filesore优化索引案例
-- 索引的使用场景:
	-- 对于非常'小'的表、大部分情况下简单的全表扫描比建立索引更高效(不适用索引)
	-- 对于'中到大型'的表,索引就非常有效(适用索引)
	-- 但是对于'特大型'的表,建立和维护索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配,例如可以使用'分区技术'(不适用索引)
	
-- 索引分类
	-- 储存结构:
		-- B-Tree索引(MySQL使用B+Tree):​B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中
		-- B+Tree索引:是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高
		-- Hash索引:对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针
		-- full-index全文索引
		-- R-Tree索引
	-- 应用层次:
		-- 普通索引:单列索引,一个可以有多个(eg:id/name/age/sex...)
		-- 唯一索引:索引列值唯一,但允许空值(eg:id)
		-- 复合索引:多列索引(eg:id+class)
	-- 物理顺序/逻辑顺序:
		-- 聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引
			-- InnoDB的聚簇索引就是在同一个结构保存了B-Tree(技术上说B+Tree)和数据行
			-- mysql里主键就是聚集索引
			-- 最好在创建表的生活建聚集索引,由于聚集索引的物理顺序上的特殊性,因此如果再在上面创建索引的时候会根据索引列的排序移动全部数据行上面的顺序,会非常地耗费时间以及性能
		-- 非聚集索引:不是聚集索引就是非聚集索引
			-- 非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。
	
	-- 结论:mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。
-- 索引的特点
	-- 可以加快数据库检索速度
	-- 降低数据库插入修改删除的速度
	-- 只能创建在表上,不能创建到视图上
	-- 使用查询处理器执行SQL语句,在一个表上,一次只能使用一个索引
-- 索引优点
	-- 创建唯一性索引,保证数据库表中每一行数据的唯一性
	-- 大大加快数据的检索速度,这是创建索引的最主要的原因
	-- 加速数据库表之间的连接,特别是在实现数据的参考完整性方面特别有意义
	-- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
-- 索引缺点
	-- 索引需要占用物理空间,除了数据表占用数据空间之外,每一个索引还要占一定的物理空间,如果建立聚簇索引,那么需要的空间就会更大
	-- 当对表中的数据进行增加、删除和修改的时候,索引也需要维护,降低数据维护的速度
	
	
-- (面试)为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?
	-- 1.hash:虽然可以快速定位,但是没有顺序,IO复杂度高。
	-- 2.二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。
	-- 3.红黑树:树的高度随着数据量增加而增加,IO代价高。
	
-- (面试)为什么官方建议使用自增长主键作为索引?
	-- 结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率

-- (面试)索引失效的情况/那些情况不会使用索引?
-- 链接:https://github.com/frank-lam/2019_campus_apply/blob/master/notes/MySQL.md#7-%E7%B4%A2%E5%BC%95%E5%A4%B1%E6%95%88


-- (面试)那些情况适合建立索引?
-- 链接:https://github.com/frank-lam/2019_campus_apply/blob/master/notes/MySQL.md#8-%E5%9C%A8%E4%BB%80%E4%B9%88%E6%83%85%E5%86%B5%E4%B8%8B%E9%80%82%E5%90%88%E5%BB%BA%E7%AB%8B%E7%B4%A2%E5%BC%95

-- 例子1:建立索引
CREATE INDEX c1 ON demo(NAME);-- 给'name'建立索引(create)
ALTER TABLE demo ADD INDEX c2(PASSWORD); -- 给'password'建立索引(alter)
CREATE INDEX c3 ON demo(NAME,PASSWORD);	-- 建立联合索引
ALTER TABLE demo ADD PRIMARY KEY(id);-- 建立主键/聚集索引
ALTER TABLE demo ADD CONSTRAINT pk_id PRIMARY KEY(id);

DROP INDEX c3 ON demo;-- 删除索引
ALTER TABLE demo DROP PRIMARY KEY;-- 删除primary索引

SHOW INDEX FROM demo;-- 查看索引
	
-- 例子2:explain查看sql效率
EXPLAIN SELECT * FROM demo;
EXPLAIN SELECT id,NAME,PASSWORD FROM demo WHERE id = 1;

猜你喜欢

转载自blog.csdn.net/qq_38056704/article/details/82807146