`

mysql索引类型及特点

阅读更多
1. 普通索引
这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

创建及修改方式
–直接创建索引
CREATE INDEX index_name ON table(column(length));
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
–删除索引
DROP INDEX index_name ON table


2. 唯一索引
索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。

–创建唯一索
CREATE UNIQUE INDEX indexName ON table(column(length))
–修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

3. 单列索引、多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

4. 组合索引(最左前缀)
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:
(1)–使用到上面的索引

SELECT * FROM article WHREE title='测试' AND time=1234567890;
SELECT * FROM article WHREE utitle='测试';
(2)–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。


5. 全文索引(FULLTEXT)

FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。////对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
比如:content字段

–修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)
–直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)

SELECT * FROM table_name WHERE MATCH(index_name) AGAINST(‘搜索值’);
多词请用逗号或空格分开:
SELECT * FROM table_name WHERE MATCH(index_name) AGAINST(‘a,b’);

注:当个别词的出现频率超过50%时,被认作无效词,可以改为AGAINST (‘高频词’ IN BOOLEAN MODE)。

可以改为AGAINST (‘高频词’ IN BOOLEAN MODE)。

找到mysql.ini,在在 [mysqld] 位置添加:ft_min_word_len=1
重启mysql服务。
查看mysql环境变量:show variables;就可以看到设置的结果了

1.全文索引的字段类型必须为:char,varchar,text 。
2.对于中文全文索引,必须先把字段值做好中文分词,每个关键词之间用“ ,”“ ”分开,不然即使全文索引还是无效,谁让这些都是老外开发的呢(英文单词之间都是空格,妥妥的),


全文索引的几个注意事项

搜索必须在类型为fulltext的索引列上,match中指定的列必须在fulltext中指定过
仅能应用在表引擎为MyIsam类型的表中(MySQL 5.6以后也可以用在Innodb表引擎中了)
仅能再char、varchar、text类型的列上面创建全文索引
像普通索引一样,可以在定义表时指定,也可以在创建表后添加或者修改
对于一个大数量级记录插入,向没有索引的表中插入数据后创建索引比向有索引的数据表中插入的过程要快很多
搜索字符串必须是一个常量字符串,不能是表的列名
在搜索记录的选择性超过50%的时候,认为没有匹配(只在自然搜索中限制)


全文索引搜索语法
MATCH (列名1, 列名2,…) AGAINST (搜索字符串 [搜索修饰符])

其中在match里面指定的列名1、2等,就是在建立全文索引中指定的列名, 后面的搜索修饰符说明如下:
search_modifier:

{

IN NATURAL LANGUAGE MODE

| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION

| IN BOOLEAN MODE

| WITH QUERY EXPANSION

}


几种搜索类型的简介

上面的搜索修饰符,实际上说明了3种全文搜索类型

IN NATURAL LANGUAGE MODE

简介:默认的搜索形式(不加任何搜索修饰符或者修饰符为 IN NATURAL LANGUAGE MODE 的情况)

特点:

对于搜索字符串中的字符都解析为正常的字符,没有特殊意义
对屏蔽字符列表中的字符串进行过滤
当记录的选择性超过50%的时候,通常被认为是不匹配。
返回记录按照记录的相关性进行排序显示

模式下的应用:

还是应用在product表,其中在name字段我们建立了全文索引,因为我需要根据关键词在name列匹配出相关记录

Sql语句如下:

SELECT * FROM product WHERE match(name) against(‘auto’)

时间还不错,在将近87w的记录中命中了1w多条,耗时1.15秒,效果还是不错

注意:在默认的情况下已经是根据相关性从高到低返回记录了


IN BOOLEAN MODE

简介:布尔模式搜索(搜索修饰符为IN BOOLEAN MODE的情况)

特点:

会按照一定的规则解析搜索字符串中的特殊字符的含义,进行一些逻辑意义的规则。如:某个单词必须出现,或者不能出现等。
这种类型的搜索返回的记录是不按照相关性进行排序的
模式下的应用:

在布尔匹配模式中,我们可以添加一些特殊的符号,增加一些搜索过程的逻辑功能。如官方网站中提供的实例(搜索含有mysql字符串 且 不含Yousql的语句):

SELECT * FROM articles WHERE MATCH (title,body)

-> AGAINST (‘+MySQL -YourSQL’ IN BOOLEAN MODE);


WITH QUERY EXPANSION

简介:一种稍微复杂的搜索形式,实际上是进行了2次自然搜索,可以返回记录直接简介性关系的记录,修饰词IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 或者WITH QUERY EXPANSION modifier

特点:这种类型的搜素,实际上提供了一种间接的搜索功能,比如:我搜索某个词,而且返回的第一行中却不包含搜索词中的任意字符串。可以根据第一次搜索结果的记录词进行第二次匹配,从而可能找到一些间接关系的匹配记录


重要的几个特性:

1. 哪些词会被忽略

搜索词太短 默认全文索引认为4个以上字符的单词是有效词,我们可以在配置中修改ft_min_word_len进行配置

屏蔽词表中的词 默认的全文索引将一些常用词屏蔽掉,因为这些词太常见了,没有任何语义作用,所以搜索过程中是忽略不计的。当然这个列表也是可以配置的。

2. 如何进行分词的

全文索引认为一个连续的有效字符(正则中\w匹配的字符集)是一个单词,也可以包含一个“’”, 但是连续的两个’会被认为是一个分隔符。其他的分隔符如:空格、逗号、句点等


实际上,上面的操作隐含了几个意思:

加号:相当于and

减号:相当于not

没有:相当于or

下面看下布尔类型搜索的几个重要特性:

1. 没有50%记录选择性的限制,即使搜索结果记录超过总数的50%也同样返回结果

2. 不会自动的按记录的相关性进行降序排序

3. 可以直接应用在没有创建fulltext的全文索引上,但是这样会查询的非常慢,所以说还是别用了。

4. 支持最小、最大单词长度

5. 应用屏蔽词列表


布尔搜索支持的操作符:

n 加号 +:指示修饰的单词必须出现在记录中

n 减号 -:指示修饰的单词必须不能出现在记录中

n 没有任何操作符:单词可有可无,但是包含该词的记录相关性高

n 双引号 “ : 将一个词组作为一个匹配。如:”one word” 匹配one word在一起的单词


下面是官方的一些实例:

至少包含一个词的记录

‘apple banana’

必须包含着两个词

‘+apple +juice’

必须包含apple,包含macintosh的记录相关性高,也可以不包含

‘+apple macintosh’

必须包含apple且不能喊有macintosh

‘+apple -macintosh’

查找apple开头单词的记录

‘apple*’

完整匹配some words单词

‘”some words”‘


索引的使用场景:
1. 何时使用聚集索引或非聚集索引?

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序 使用 使用
返回某范围内的数据 使用 不使用
一个或极少不同值 不使用 不使用
小数目的不同值 使用 不使用
大数目的不同值 不使用 使用
频繁更新的列 不使用 使用
外键列 使用 使用 使用
主键列 使用 使用 使用
频繁修改索引列 不使用 使用

2. 索引不会包含有NULL值的列(索引的命中)
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

3. 使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。


4. 索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。


5. like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

6. 不要在列上进行运算
例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。关于这一点可以围观:一个单引号引发的MYSQL性能损失。


最后总结一下,MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的,比如我刚才针对text类型的字段创建索引的时候,系统差点就卡死了。



分享到:
评论

相关推荐

    mysql索引的类型和优缺点

    针对MySQL索引的特点、应用进行了详细的描 述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用。本文摘自《MySQL 5权威指南》(3rd)的8.9节。索引是一种特殊的文件

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ │ 3_MySQL索引类型介绍.mp4 │ │ 4_MySQL索引底层结构和执行计划.mp4 │ │ 5_MySQL索引优化原则.mp4 │ │ 6_MySQL运维常见错误part1.mp4 │ │ 7_MySQL运维常见错误part2.mp4 │ │ ERROR1040_1917970.1.pdf ...

    MYSQL

    1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL ...

    MySQL中文参考手册.chm

    1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 ...

    Mysql中的索引精讲

    常见索引类型(实现层面) 索引种类(应用层面) 聚簇索引与非聚簇索引 覆盖索引 最佳索引使用策略 1.常见索引类型(实现层面) 首先不谈Mysql怎么实现索引的,先马后炮一下,如果让我们来设计数据库的索引,该怎么...

    MySQL中文参考手册

    o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o 1.8 有用的MySQL相关链接 * 2 MySQL 邮件列表及如何提问或报告错误 o 2.1 MySQL邮件列表 o 2.2 提问或报告错误 o ...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    3-MySQL索引优化生产案例讲解02 4-linux运维人员必须掌握的核心经验案例.avi MySQL数据库生产场景核心优化精讲 5-MySQL数据库硬件优化生产方案及细节精讲01.avi 6-MySQL数据库系统优化生产方案及细节精讲02.avi 7-...

    mysql面试题.docx

    MySQL中常见的索引类型包括B-tree索引、哈希索引和全文索引。 如何创建数据库和表? 答案:创建数据库的语句是CREATE DATABASE database_name;,创建表的语句是CREATE TABLE table_name (column1 datatype, column2...

    聊聊高并发高可用那些事(Kafka、Redis、MySQL)

    - 索引类型和方式、聚簇和非聚簇索引 - 回表、覆盖索引、最左前缀、联合索引、索引下推 - Explain分析SQL语句 - 索引失效的场景、索引优化方案 - TB级数据(600亿条)存储和访问 - 事务特征和隔离级别 - 乐观锁和悲观...

    掌握MySQL面试技巧.pptx

    2、MySQL索引:索引是MySQL中优化查询性能的重要手段,会影响到数据库的查询速度和数据唯一性等方面。因此,在面试过程中,需要掌握索引的各种类型以及创建、调整、删除等操作。 3、MySQL约束:约束是用来限制MySQL...

    MySQL网络培训精品班-Inside君姜承尧

    nside君的MySQL网络培训班课程特点: 业界最权威的MySQL数据库培训师姜承尧老师(也就是Inside君本人啦)亲授.姜承尧老师出版了《MySQL技术内幕:InnoDB存储引擎》、《MySQL内核:InnoDB存储引擎》等Mysql书籍。 ...

    169集全新MySQL课程 MySQL技能全面探索 MySQL核心特训教程 MySQL零基础实战班视频

    全新的MySQL视频教程,课程对MySQL的核心知识点进行了大量深入的展开,细致的讲解和总结 较以往的MySQL核心基础课程...├─8、课程:SQL进阶使用(下).1、索引类型.mp4 ├─8、课程:SQL进阶使用(下).2、UNIQUE-I

    mysql网络数据库指南(中文版) part1

    3.1 MySQL 中的SQL特征 99 3.2 MySQL 的命名规则 100 3.2.1 引用数据库的成分 100 3.2.2 SQL语句中的大小写规则 101 3.3 创建、删除和选择数据库 101 3.4 创建、删除、索引和更改表 102 3.4.1 CREATE TABLE...

    Java面试题mysql数据库和jvm知识面试题用于技能提升和面试提升

    MySQL索引的类型 13 索引原理 13 Mysql索引管理 14 索引的两大类型hash与btree比较 15 索引原则 15 索引无法命中 15 慢查询 16 DB锁 17 乐观锁悲观锁 17 JVM内存结构 19 内存结构 19 Java堆 20 JVM GC过程 20 GC执行...

    mysql面试题,MySQL是一种关系型数据库管理系统,由Oracle公司开发

    3. MySQL的数据类型有哪些? 答:数值型(整数、小数)、日期型、字符串型、布尔型等 4. MySQL的索引有哪些? 答:主键索引、唯一索引、普通索引 5. MySQL的事务有哪些级别? 答:读未提交(READ UNCOMMITTED)、读已提交...

    MYSQL培训经典教程(共两部分) 1/2

    MYSQL 语言参考 217 1.1 数据类型参考:怎么写字符串和数字 217 1.1.1 字符串 217 1.1.2 数字 219 1.1.3 十六进制值 219 1.1.4 NULL值 219 1.1.5 数据库、表、索引、列和别名的命名 220 1.1....

    MySQL高级面试题整理及答案.rar

    4. 完善的索引和查询优化:MySQL提供了丰富的索引机制,可以加快数据访问和查询的速度。此外,MySQL还具有强大的查询优化功能,使得复杂查询的执行更加高效。 5. 多用户和权限控制:MySQL支持多用户访问和管理...

    基于 nodejs express mysql 开发的留言板 demo.zip

    MySQL 是一款广受欢迎的开源关系型数据库...总之,MySQL凭借其开源、跨平台、高性能、灵活扩展、丰富功能集和庞大社区支持等特点,成为现代数据管理领域中不可或缺的一部分,适用于各种行业和业务场景的数据库需求。

    MySQL高级面试题及答案,企业真面试题.rar

    4. 完善的索引和查询优化:MySQL提供了丰富的索引机制,可以加快数据访问和查询的速度。此外,MySQL还具有强大的查询优化功能,使得复杂查询的执行更加高效。 5. 多用户和权限控制:MySQL支持多用户访问和管理...

Global site tag (gtag.js) - Google Analytics