14、索引

索引

索引被用来快速找出想要的数据,提高性能。
没有索引,数据库不得不从第一条记录开始搜索,效率非常低。
MYISAM与INNODE都使用B-Tree作为索引结构

索引可分单列索引(主键索引,唯一索引,普通索引)和组合索引

  • 单列索引:一个索引只包含一个列,一个表可以有多个单列索引
  • 组合索引:一个组合索引包含两个或两个以上的列

主键,unique都会自动添加索引
Mysql默认配置索引的词长度是4

1、单列索引

1.1、普通索引

创建索引

  • 格式1
    alter table 表名 add index 索引名(字段名);
  • 格式2
    create index 索引名 on 表名(字段名);
alter table emp2 add index ename_index(ename); #格式1
create index ename_index on emp2(ename); #格式2

show index from emp2; #查看索引

使用索引查询

在selct前面加explain,如果看到type!=all,则说明使用了索引

#查出名字是C开头的记录
MariaDB> explain select * from emp2 where ename like 'C%';
+------+-------------+-------+-------+---------------+-------------+---------+------+------+-----------------------+
| id   | select_type | table | type  | possible_keys | key         | key_len | ref  | rows | Extra                 |
+------+-------------+-------+-------+---------------+-------------+---------+------+------+-----------------------+
|    1 | SIMPLE      | emp2  | range | ename_index   | ename_index | 33      | NULL | 1    | Using index condition |
+------+-------------+-------+-------+---------------+-------------+---------+------+------+-----------------------+

删除索引

  • 格式1
    drop index 索引名 on 表名;

  • 格式2
    alter table 表名 drop index 索引名;

  • 格式3(只针对pk)
    alter table 表名 drop primary key;

drop index ename_index on emp2; #格式1
alter table emp2 drop index ename_index; #格式2
alter table emp2 drop primary key; #删除主键

1.2、唯一索引

与普通索引的区别是,要求所有此字段所有数据都是唯一的,但允许有空值

创建索引

  • 格式1
    create unique index 索引名 on 表名(字段名);

  • 格式2
    alter table 表名 add unique(字段名);

create unique index ename_unique on emp2(ename); #格式1
alter table emp2 add unique(ename); #格式2

1.3、主键索引

即主键约束,要求字段数据唯一且不为空,按照约束的操作方式进行操作即可

2、组合索引

组合索引是一个索引名,包含了多个字段

创建索引

格式
create index 索引名 on 表名(字段1,字段2,字段3...);

create index job_hiredate_sal_index on emp2(job,hiredate,sal);

建立如上组合索引(job_hiredate_sal_index),实际是包含3个索引:(job),(job,hiredate),(job,hiredate,sal)
索引遵守“最左前缀”原则

  • 不按索引最左列开始查询
    index(job,hiredate,sal),where hiredate='1980-12-17'不会使用索引,where hiredate='1980-06-07' and sal=800不会使用索引

  • 查询中某个列有范围查询,则其右侧无法用到索引查询
    where job='clerk' and hiredate like '1980%' and sal=800,该查询只会使用索引的前两列

  • 不能跳过牟广丰字段进行查询,这样不会用到索引
    where job>'clerk' and hiredate='1980-12-17' and sal=800;第一个字段出现范围符号查询,那么不会用到索引查询

3、全文检索

3.1基础全文所搜

全文检索fulltext的要求

  • 存储引擎必须是MyISAM或者mysql5.6以上的InnoDB
  • 字段类型必须是char,varchar,text

由于Mysql默认配置的索引词长是4,所以要支持中文单字的话,首先要修改ft_min_word_len参数
如果是2可能会出现搜索不到数字或者英文的情况,可以改为1,一般是/etc/my.cnf,如果没找到
,可以先查找find / -name 'my.cnf'

ft_min_word_len = 1

创建全文索引

格式
create fulltext index 索引名 on 表名(字段名1,字段名2...);

使用全文索引

create fulltext index job_fulltext on emp2(job);
explain select * from emp2 where match(job) against('clerk');

like区别,对于数据量级到达十万百万的级别,fulltext性能明显优于like,另外对于搜索能够明确控制,并智能 化给出结果

全文搜索一个重要部分就是对结果排序

MariaDB> select job,match(job) against('clerk') as rank from emp2;
+-----------+--------------------+
| job       | rank               |
+-----------+--------------------+
| CLERK     | 0.2960100471973419 |
| SALESMAN  |                  0 |
| SALESMAN  |                  0 |
| MANAGER   |                  0 |
| SALESMAN  |                  0 |
| MANAGER   |                  0 |
| MANAGER   |                  0 |
| ANALYST   |                  0 |
| PRESIDENT |                  0 |
| SALESMAN  |                  0 |
| CLERK     | 0.2960100471973419 |
| CLERK     | 0.2960100471973419 |
| ANALYST   |                  0 |
| CLERK     | 0.2960100471973419 |
+-----------+--------------------+

#上述有个rank等级,全文搜索根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含该词的行的数目来计算等级。等级高的排在结果前面

3.2、全文搜索的查询扩展

格式
select 字段 from 表名 where match(字段) against('搜索字符串' with query expansion);

机制:

  • 首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行
  • 其次,Mysql检查这些匹配行并选择所有有用的词
  • 再次,Mysql再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词

3.3、布尔文本搜索

机制:

  • 要匹配的词
  • 要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词)
  • 排列提示(指定某些词比其他词更重要,更重要的词等级更高)
  • 表达式分组
  • 另外一些内容

布尔方式即使没有定义fulltext索引也可使用,但这是一种非常缓慢的操作

格式
select 字段 from 表名 where match(字段) against('需要的词 其他条件的词' in boolean mode);

全文本布尔操作符

布尔操作符 说明
+ 包含,词必须存在
- 排除,词必须不出现
> 包含,而且增加等级值
< 包含,且减少等级值
() 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~ 取消一个词的排序值
* 词尾的通配符
"" 定义一个短语(与单个词的列表不样,它匹配整个短语以便包含或排除这个短语)

4、索引使用分析

适用场景

  • 表中该字段中的数据量庞大
  • 经常被检索,经常出现在where子句中的字段
  • 经常被DML操作的字段不建议添加索引

优点

  • 大大提高检索数据的性能效率
  • 在表连接的连接条件,可以加速表与表直接的相连
  • 在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)

缺点

  • 创建与维护索引会消耗时间,并随着数据量的增加而增加
  • 索引也会占用物理存储空间
  • 在进行DML操作的时候,索引也要动态的维护,会降低数据的维护速度
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,710评论 0 2
  • Oracle SQL基本操作 Oracle数据库基本操作 1.概述 Oracle数据库客户端一般需要安装在服务器上...
    横竖撇捺啊阅读 529评论 0 1
  • 1.SQL概述 SQL语言(Structured Query Language)是一种数据库查询和程序设计语言,用...
    Rannio阅读 585评论 0 4
  • 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资? –查询工资最高和最低的工资是多少? –查询公...
    C_cole阅读 7,284评论 0 3
  • 目标 聚合函数 分组函数 子查询 多行子查询 引出 •请思考如下问题? –查询所有员工的每个月工资总和,平均工资?...
    wqjcarnation阅读 4,146评论 0 6