MySQL索引类型和索引种类

MySQL索引类型和索引种类
1, MySQL索引类型

Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
1). FULLTEXT
即为全文索引,MySQL5.6以前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。

全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

2). HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。

HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

3). BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

4). RTREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找。

2, 索引种类
1)普通索引:仅加速查询
2)唯一索引:加速查询 + 列值唯一(可以有null)
3)主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
4)组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
5)全文索引:对文本的内容进行分词,进行搜索
6)函数索引: mysql8以上的版本才支持.
3, 操作索引
3.1 创建索引
创建普通索引: create index index_name on table_name(col_name);
创建唯一索引: create unique index index_name on table_name(col_name);
创建普通组合索引:
create index index_name on table_name(col_name_1,col_name_2);
创建唯一组合索引:
create unique index index_name on table_name(col_name_1,col_name_2);
创建索引遇到字符串需指定长度
create index index_name on table_name(col_name(11));
创建函数索引
create index index_name on table_name(函数(col_name));
创建全文索引
create fulltext index index_name on student(name)
MySQL5.7.6以后创建中文分词的全文索引
create fulltext index index_name on student(name) WITH PARSER ngram;
使用全文索引: MATCH (建立全文索引的字段) AGAINST (‘要查询的字符串’)
SELECT * FROM student WHERE MATCH(name) AGAINST(‘聪’)
SELECT * FROM student WHERE MATCH(name,address) AGAINST(‘聪 广东’)
ngram全文解析器
ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“生日快乐”进行分词:
n=1: ‘生’, ‘日’, ‘快’, ‘乐’
n=2: ‘生日’, ‘日快’, ‘快乐’
n=3: ‘生日快’, ‘日快乐’
n=4: ‘生日快乐’
MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。
全局变量ngram_token_size的设置方法:
修改MySQL配置文件
[mysqld]
ngram_token_size=2
3.2 通过修改表结构创建索引
ALTER TABLE table_name ADD INDEX index_name(col_name);
3.3 创建表时直接指定索引
create table table_name (
id int not null,
col_name varchar(16) not null,index index_name (col_name)
);
3.4 删除索引
直接删除索引: drop index index_name on table_name;
修改表结构删除索引: alter table table_name drop index index_name;
3.5 其他相关命令

说明 sql语句
查看表结构 desc table_name;
查看生成表的SQL show create table table_name;
查看索引 show index from table_name;
查看执行时间 set profiling = 1;
SQL…
show profiles;
查看执行计划explain explain select…

4, 什么时候适合创建索引
4.1 数据量很大,但是查询的比较少时
4.2 总是查询很少做增删改
4.3 在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。
(某些时候的解释: %不能放前面, 因为在以通配符%和_开头作查询时,MySQL不会使用索引)

5, 用了索引也不生效的时候
%放在了前面 select * from tb1 where name like ‘%cn’;
where 子句里对有索引列使用函数 select * from tb1 where reverse(name) = ‘wupeiqi’;
类型不一致,name是字符串 select * from tb1 where name = 999;
!=(主键除外) select * from tb1 where name != ‘alex’
非主键的字符串字段用了>
查询的数据量太大,则索引不生效 select * from tb1 where name > ‘alex’
用索引字段排序,但是select里没有索引字段 select name from tb1 order by age
组合索引时不用第一个索引字段例如:(name,email) select email from tb1 where email =‘zhangfei@163.com’
or条件有未索引字段 select * from tb1 where nid = 1 or name = ‘seven’;
where 子句里对索引列上有数学运算,用不上索引 select * from tb1 where id=id+1;
如果mysql估计使用全表扫描要比使用索引快,则不使用索引 数据量少时不用索引

6, 什么情况下不推荐使用索引
6.1数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引
比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描
6.2 频繁更新的字段不要使用索引
比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。
6.3 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引
只有在where语句出现,mysql才会去使用索引
6.4 where 子句里对索引列使用不等于(<>),使用索引效果一般

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值