索引专题面试题

什么是索引

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。

Eg拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

索引的优缺点

优点(目的)在于提高查询效率;

缺点:会降低更新表的速度,如对表进行INSERTUPDATEDELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要

索引类型

MySQL目前主要有以下几种索引类型:

1普通索引

是最基本的索引,它没有任何限制.

2唯一索引

与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一.

3主键索引

是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。

4组合索引

指多个字段上创建的索引,只有在查询条件中使用了创建一个字段,索引才会被使用。使用组合索引时遵循最左前缀。

5全文索引

主要用来查找文本中的关键字,而不是直接与索引中的值相比较.主要针对文本文件,比如文章,标题,全文索引只有MyISAM有效(mysql5.6之后InnoDB也支持了全文索引)

应该在哪些字段上添加索引呢?

1、频繁查询的字段(经常出现在where条件后面的字段),应该创建索引。

2、更新不频繁的字段,可以创建索引,更新非常频繁的字段,不应该创建索引,。

3、唯一性太差(有大量数据重复)的字段,比如像性别(sex)字段,就不应该创建索引。因为当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段性别(sex),男女几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

4、不会出现在where条件之后的字段,不应该创建索引。

MySQL性能优化

(1) 任何地方都不要使用select * from t,用具体的字段列表代替“*”,不要返回用不到的任何字段。

(2) 慎用 in 和 not in,改用 exists 和 between

否则会导致全表扫描,如:

select id from t where num in(1,2,3);

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3;

很多时候用 exists代替 in 是一个好的选择:

select num from a where num in(select num from b);

(3)  当只要一行数据时使用limit 1

查询时如果已知会得到一条数据,这种情况下加上limit 1会增加性能。因为MySQL数据库引擎会在找到一条结果停止搜索,而不是继续查询下一条是否符合标准直到所有记录查询完毕。

索引会失效:

(4) 对于使用like的查询,查询如果是’%a'不会使用到索引 ,而 like 'a%'就会用到索引。最前面不能使用%和_这样的变化值

(5) 应尽量避免在 where 子句中使用 != 或 < > 操作符

否则引擎将放弃使用索引而进行全表扫描。

(6) 应尽量避免在 where 子句中使用 or 来连接条件

否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20;

可以这样查询,将 or 用 union all 来替换:

select id from t where num=10 union all select id from t where num=20;

(7) 应尽量避免在 where 子句中对字段进行表达式操作或者函数

反正不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

如:select id from t where num/2=100;

应改为:select id from t where num=100*2;

索引的数据结构是什么?

答案:索引的数据结构是B-Tree和B + Tree

参考:

https://blog.csdn.net/lmh12506/article/details/8879916

好文

https://blog.csdn.net/wdjxxl/article/details/79790421

https://cloud.tencent.com/developer/article/1485777

索引不起作用

https://blog.csdn.net/weixin_36586564/article/details/79641748

SQL优化——索引

https://www.jianshu.com/p/5f89db804752

猜你喜欢

转载自www.cnblogs.com/liaowenhui/p/12318812.html
今日推荐