mysql 的索引

MyISAM:对于此存储引擎,,其数据行保留在数据文件里,而索引值则保存在索引文件中,。一个表可以有多个索引,但他们都保存在同一个索引文件里。索引文件中的每一个索引都由一组有序的关键字构成,这个组关键字行主要用于快速访问数据文件。

InnoDB:把索引值当作是一组有序值,此存储引擎只使用一个表空间,在这个表空间存储着所有的数据存储和索引存储,给定表的数据和索引都保存在同一个表空间文件里。

索引的代价

所以可以加快检索速度,但它同时也降低了索引列的插入、删除和更新值的速度。索引降低了大部分与写入相关的操作的速度。因为写入一个行不仅是写入一个数据行,还要更改索引。表的索引越多,需要做出的更改就越多,平均性能也就下降的越多。

其次,索引也会占用磁盘空间,多个索引会占据更大的空间。与没有索引相比,使用索引会让你很快达到表的大小极限。

挑选索引

1. 为用于搜索、排序或分组的列创建索引,而对于用作输出显示的列则不用创建索引。

也就是最佳索引是那些出现在WHERE子句中的列、连接字句中的列或者出现在ORDER BY 或 GROUP BY子句中的列。

2. 认真考虑数据列的数据重复程度

也就是说索引适合于包含唯一值多,重复值少的列,这样的列比较适合建立索引。而对于有大量重复值出现的列,当查询优化程序确定出某个值在表的行里出现的频率很大时,他会跳过索引,转去执行全表的扫描。

3. 索引短小值

尽量使用较小的数据类型。短小值可以让比较操作更快,从而加快索引速度;短小值可以让索引短小,从而减少对磁盘I/O的请求;对于更短小的键值,键缓存里的索引块就可以容纳更多的键值。这样就能在内存里容纳更多的键,就可以提高不从磁盘读取更多索引块的前提下,提高找到的几率。

对于InnoDB,它使用聚集索引,让主键尽量短小会带来更多好处,聚集索引会把数据行和主键值存储在一起,其他的索引都是二级索引,即它们把主键值和二级索引值存储在一起。在二级索引里进行查找,会先得到主键值,然后通过它定位到相应的行,这意味着,主键值在每一个二级索引里都会重复出现,因此,如果主键值较长,会导致每一个二级索引占用更多的存储空间。

4. 索引字符串值得前缀

如果有一个很长的char(200)列,其中前10或20个字符大多数是唯一的,那么就可以不用给整个列建立索引,只为前10或20个字符建立索引即可。

5.利用最左前缀

如有组合索引a,b,c,那么就不需要在建立索引a了。

6. 不要建立过多的索引

7. 让参与比较的索引类型保持匹配

让索引失效的操作

1. 如果Mysql认为全表扫描比使用索引快,则不会使用索引。(对于数据比较少的情况)。

2. 使用多列索引,但不符合最左匹配原则。

3. 使用like查询以 “%”开头。(使用覆盖索引)

4. 条件中有or,会使索引失效。(如果想让索引有效,需要给条件or的所有列加上索引)。

5. 涉及类型转换的时候,可能会使索引失效。(如数字列 a = '4'而不是a = 4,会不使用索引。字符串不加引号也会不使用索引)。

6. 索引字段上使用is null/is not null判断时,会使索引失效。(可以使用约定特定值代替null)。

7. 在索引列上进行计算/函数等操作会使索引失效。 

8. 使用!=与<>会使索引失效。




猜你喜欢

转载自blog.csdn.net/weixin_42294335/article/details/80449874