码迷,mamicode.com
首页 > 其他好文 > 详细

索引的设计和使用

时间:2021-06-20 18:05:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ike   两种   优化   sql   ems   固定   性能   处理   文件   

一、索引的概述

  所有MySQL列类型都可以被索引,对相关列使用索引是提高Select操作性能的最佳途径。根据存储引擎可以定义每个表最大索引和最大索引的长度。每种存储索引(MyISAM、InnDB、BDB、Memory)对每个表至少支持16个索引,总索引长度至少为266字节。

MyISAM和InnoDB存储引擎的表默认创建的都是 Btree索引。

Memory存储引擎的表默认创建的是HASH索引,但也支持Btree索引。

MySQL还不支持函数索引,但支持前缀索引,即对索引字符的前N个字符创建索引;

支持索引类型:FULLTEXT,HASH,BTREE,RTREE

FULLTEXT: 

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。

HASH:hash就是一种(key=>value)形式的键值对。

由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。

那为什么还需要其他的树形索引呢?

(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询
(2)Hash 索引无法被用来避免数据的排序操作。
(3)Hash 索引不能利用部分索引键查询。
(4)Hash 索引在任何时候都不能避免表扫描。
(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

BTREE:BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中。BTREE在MyISAM里的形式和Innodb稍有不同。

RTREE:RTREE在mysql很少使用,仅支持geometry数据类型。相对于BTREE,RTREE的优势在于范围查找

各种索引的使用情况

(1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性

(2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法。

(3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。

(4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。

(5)至于RTREE,很少使用。

 

二、索引设计的原则

(1)、 最适合做索引的列是出现在where子句中的列或连接子句中指定的列。而不是出现在select选择列中的列。
(2)、使用唯一索引。考虑某列中值的分布。索引列的基数越大,索引效果就越好。例如,出生日期的列具有不同的值,很容易区分各行。而用来记录性别的列,只有M和F,则对此列进行索引没有多大用处。因为无论搜索那个值都会得出大约一半的行。
(3)、使用短索引
如果对字符串列进行创建索引,应该指定一个前缀长度,只要有可能就应该那样做。例如,有个char(200)列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。对前10个或20个字符进行索引能节省大量的索引空间,也可能会使得查询更快。较小的索引涉及的磁盘IO操作较小,较短的值比较起来更快。
(4)、利用最左前缀。
(5)、不要过度使用索引。
每个额外的索引的都要占用磁盘空间,并降低写操作的性能。在修改表的时候索引必须要进行更新,有时候可以还会重构

三、BTREE索引和HASH索引

Memory存储引擎的表可以选择使用Btree索引或者Hash索引,两种不同类型的索引各有不同的适用范围。Hash索引有重要特征需要注意:
1.只用于使用=或<= >= 操作符的等式比较。
2.优化器不能使用Hash索引来加速Order By操作;
3.MySQL不能确定在两个值之间大约有多少行;
4.只能使用整个关键字来搜索一行

下列范围查询适用于Btree索引和Hash索引

select * from t1 where key_col =1 or key_col2 in (15,18,20);

下列范围查询只适用于BTree索引

select * from t1 where key_col > 1 and key_col <10;
select * from t1 where key_col like ‘ab%‘ or key_col between ‘lisa‘ and ‘simon‘;

总结:固定值搜索用Hash,范围值或者like 用BTree

四、小结

索引用于快速找出在某个列中有一特定值的行。如果不使用索引,MySQL必须从第1条记录开始然后读完整张表直达找出相关的行,即全表扫描。记录行越大,花费的时间就越多。

大多数MySQL索引在BTree中存储。只是空间列类型的索引使用RTree。

 

索引的设计和使用

标签:ike   两种   优化   sql   ems   固定   性能   处理   文件   

原文地址:https://www.cnblogs.com/ljg3020/p/14906178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!