加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

MySQL索引类型和索引种类

发布时间:2023-01-29 14:32:06 所属栏目:MsSql教程 来源:转载
导读: MySQL索引类型和索引种类
1, MySQL索引类型
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
1). FULLTEXT
即为全文索引,MySQL5.6以前只有MyISAM引擎支持。其可以在CRE

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开始mssql 索引,依次遍历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 子句里对索引列使用不等于(),使用索引效果一般

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!