深入理解MySQL索引原理和实现 | 您所在的位置:网站首页 › mysql中索引的工作原理是什么 › 深入理解MySQL索引原理和实现 |
说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。” 但是索引是怎么实现的呢?因为索引并不是关系模型的组成部分,因此不同的DBMS有不同的实现,我们针对MySQL数据库的实现进行说明。本文内容涉及MySQL中索引的语法、索引的优缺点、索引的分类、索引的实现原理、索引的使用策略、索引的优化几部分。 一、MySQL中索引的语法创建索引 在创建表的时候添加索引 CREATE TABLE tablename( id INT(10) PRIMARY KEY, content TEXT, name CHAR(10) NOT NULL, [UNIQUE] INDEX name_index (name(4)))ENGION MyISAM DEFAULT CHARSE utf8;在创建表以后添加索引 ALTER my_table ADD [UNIQUE] INDEX my_index(content ); CREATE INDEX my_index ON my_table(content );根据索引查询 SELECT * FROM tablename WHERE MATCH(content) AGAINST('word1','word2',...);删除索引 DROP my_index ON tablename;查看表中的索引 SHOW INDEX FROM tablename二、索引的优缺点优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表; 三、索引的分类常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引 1、主键索引:即主索引,根据主键pk_clolum(length)建立索引,不允许重复,不允许空值; ALTER TABLE 'table_name' ADD PRIMARY KEY('col');2、唯一索引:用来建立索引的列的值必须是唯一的,允许空值 ALTER TABLE 'table_name' ADD UNIQUE('col');3、普通索引:用表中的普通列构建的索引,没有任何限制 ALTER TABLE 'table_name' ADD INDEX index_name('col');4、全文索引:用大文本对象的列构建的索引(下一部分会讲解) ALTER TABLE 'table_name' ADD FULLTEXT('col');5、组合索引:用多个列组合构建的索引,这多个列中的值不允许有空值 ALTER TABLE 'table_name' ADD INDEX index_name('col1','col2','col3');*遵循“最左前缀”原则,把最常用作为检索或排序的列放在最左,依次递减,组合索引相当于建立了col1,col1col2,col1col2col3三个索引,而col2或者col3是不能使用索引的。 *在使用组合索引的时候可能因为列名长度过长而导致索引的key太大,导致效率降低,在允许的情况下,可以只取col1和col2的前几个字符作为索引 ALTER TABLE 'table_name' ADD INDEX index_name(col1(4),col2(3));表示使用col1的前4个字符和col2的前3个字符作为索引 四、索引的实现原理MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,B+Tree索引,哈希索引,全文索引等等, 1、哈希索引:只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。 2、全文索引:FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据,生成全文索引非常的消耗时间和空间。对于文本的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。FULLTEXT可以在创建表的时候创建,也可以在需要的时候用ALTER或者CREATE INDEX来添加: //创建表的时候添加FULLTEXT索引 CTREATE TABLE my_table( id INT(10) PRIMARY KEY, name VARCHAR(10) NOT NULL, my_text text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, FULLTEXT(my_text));//创建表以后,在需要的时候添加FULLTEXT索引 ALTER my_table ADD FULLTEXT ft_index(my_text); CREATE INDEX ft_index ON my_table(my_text);*对于较大的数据集,把数据添加到一个没有FULLTEXT索引的表,然后添加FULLTEXT索引的速度比把数据添加到一个已经有FULLTEXT索引的表快。 *MySQL自带的全文索引只能用于MyISAM存储引擎,如果是其它数据引擎,那么全文索引不会生效。 *在MySQL中,全文索引支队英文有用,目前对中文还不支持。 *在MySQL中,如果检索的字符串太短则无法检索得到预期的结果,检索的字符串长度至少为4字节,此外,如果检索的字符包括停止词,那么停止词会被忽略。 3、BTree索引和B+Tree索引BTree索引BTree是平衡搜索多叉树,设树的度为d(d>1),高度为h,那么BTree要满足以一下条件: 每个叶子结点的高度一样,等于h; 每个非叶子结点由n-1个key和n个指针point组成,其中d |
CopyRight 2018-2019 实验室设备网 版权所有 |