索引在mysql中也叫做键(key),是存储引擎用于快速找到记录的一种数据结构。
索引结构类型(常见有两种):
1. B-Tree索引
大多数mysql引擎都支持这种索引;
1.B-Tree通常意味着所有的值都是按顺序存储的,
2.并且每一个叶子页到根的距离相同;
存储引擎不需要进行全表扫描来获取需要的数据,取而代之是从索引的根节点开始进行搜索;
适用于:
A. 全键值查找(全值匹配)
B. 键值范围(若是有多列的合并索引,需要精确匹配某一列并范围匹配另一列)
C. 键前缀查找
D. 按顺序查找(order by)
限制:
A. 如果不是按照索引的最左列开始查找,则无法使用索引
B. 不能跳过索引中的列
C. 如果查询中有某个列的范围查询,其右边的所有列都无法使用索引优化查询
2. 哈希索引
在mysql中,只有memory引擎显式支持哈希索引;基于哈希表实现,只有精确匹配索引所有列的查询才有效;对于每一行数据,存储引擎会对所有的索引列计算一个哈希码,不同的键值行计算出的哈希码不一样,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针;(hash索引结构:hash值:指针)
优势:
查找速度非常快
限制:
A. 无法用于排序
B. 不支持部分索引列匹配查找
C. 只支持等值比较查询
存储引擎不支持哈希索引时,可以建立自定义哈希:
如:建表pseudohash:id,url,url_crc;
建立触发器:insert数据时 set new.url_crc = crc32(new.url);
Update数据时 set new.url_crc = crc32(new.url);
查找:select url , url_crc from pseudohash where url_crc = crc32(“www.baidu.com”) and url = “www.baidu.com”;
在where语句中带人hash值和对应列值。
索引功能类型:
1.普通索引(INDEX )
CREATE INDEX index_name ON table_name (column_list);
2.唯一索引(UNIQUE INDEX)
mysql数据库索引列的值必须唯一,但允许有空置。如果是组合索引,列值的组合必须唯一。
CREATE UNIQUE INDEX index_name ON table_name (column_list)
3.主键索引(PRIMARY KEY)
是一种特殊的唯一索引,不允许有空置,一般在建表时创建
CREATE TABLE table_name (
ID INT NOT NULL,
[column] VARCHAR(16) NOT NULL,
PRIMARY KEY(ID)
);
4.全文索引:(FULLTEXT)只可以用在MyISAM引擎
对大数据文本进行索引,在建立的索引中对要查找的单词进行搜索,定位哪些文本数据包括要搜索的单词。
1,建立索引 2,在索引中搜索定位
//针对content做了全文索引:
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content) );
查找时:
SELECT * FROM article WHERE MATCH( content) AGAINST('想查询的字符串')
索引的优点:
1. 可以让服务器快速定位到表的指定位置,大大减少了服务器需要扫描的数据量
2. 最常见的b-tree索引按照顺序存储数据,可以用来做order by和group by,帮助服务器避免排序和临时表,将随机I/O变为顺序I/O
3. 因为索引中存储了实际的列值,某些查询只需要使用索引就能完成全部查询
索引优化
1. 前缀索引
问题:有时候索引需要存储很长的字符串,会让索引变得大且慢
解决:1. hash索引 2. 前缀索引
索引的选择性:不重复的索引值 / 数据表的记录总数,数值越高性能越好;
唯一索引的选择性是1,性能是最好的
计算适合的前缀长度,使前缀的选择性接近于完整列的选择性。Mysql无法使用前缀索引做order by和group by,也无法使用前缀索引做覆盖扫描;
2. 选择合适的索引列顺序
将选择性最高的列放在索引最前列
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。