什么是索引?
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
Eg:拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。
索引的优缺点?
优点(目的)在于提高查询效率;
缺点:会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,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优化——索引