概述:

  类似于书籍的目录,找到一本书的特定内容,需要首先找到内容对应页码,定位对应页码

  存储引擎使用类似方法进行数据查找,先找到索引中对应值,然后根据匹配的索引找到对应行

实现原理:

  索引的实现通常使用B-Tree 及其变种B+树。(还有HASH)

优缺点:

  优点:

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因
  • 帮助服务器避免排序和临时表

  缺点:

  • 降低写、改速度
  • 占用磁盘空间

使用场景:

  • 对于非常小的表,全表扫描更快
  • 中大型表索引非常有用

使用:

Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

PRIMARY KEY(主键索引)

  ALTER TABLE `table_name` ADD PRIMARY KEY ( `col` ) 

UNIQUE(唯一索引)

  ALTER TABLE `table_name` ADD UNIQUE (`col`)

INDEX(普通索引)

ALTER TABLE `table_name` ADD INDEX index_name (`col`)

FULLTEXT(全文索引)

  ALTER TABLE `table_name` ADD FULLTEXT ( `col` )

组合索引 (复合索引)

 ALTER TABLE `table_name` ADD INDEX index_name (`a`, `b`, `c` ) 

  • 遵循前缀原则
  • WHERE( `a` = 1,`c` = 1) 不会用到索引
  • WHERE(`a` = 1 , `b` =1)可以用到索引

删除索引

ALTER TABLE table_name DROP INDEX index_name

查看索引

mysql> show index from tblname;
mysql> show keys from tblname;

主键索引和唯一索引区别:

  • 主键索引只能有一个
  • 主键索引一定是唯一索引,唯一索引不一定是主键索引
  • 主键索引不能为空

索引创建原作

  • 最适合索引的列是 WHERE子句 或者 ON 子句 后的列
  • 根据情况适当创建复合索引
  • 尽可能选择数据小的列,节约磁盘空间

mysql 常用命令行:

查看表结构

SHOW CREATE TABLE tableName \G

修改存储引擎

ALTER TABLE my_table ENGINE = InnoDB;

注意事项:

1.索引不存储null值

2.不适合键值较少的列(重复数据较多的列)

3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')

4.索引失效的几种情况

  1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

  2.对于多列索引,不是使用的第一部分,则不会使用索引

  3.like查询以%开头  

  4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

  5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

全文索引:

分词索引基本使用方法:

 SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪')

分词,全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符

也就是说

SELECT * FROM `vote_record` where MATCH(`user_id`) AGAINST('aewk'); 

无法检索到数据库中user_id字段为 aewK0F7rGWvxZbNiTqj7 的值

mysql5.7版本之前不支持中文检索

解决方法:

  1 . 在表中新建一个拼音字段,程序将中文转换拼音后存入这个字段

  2. mysql5.7.6之后自带有 n-gram parser ,我们可以用他轻松的实现分词功能

使用方法:

注意:1 . ngram只支持InooDB引擎2.  每次在修改完mysql.ini后需要 OPTIMIZE TABLE TABLE_NAME 对索引重构

1. 在mysql.ini中设置分词大小,默认是2

[mysqld]
ngram_token_size=2

分词的SIZE越大,索引的体积就越大,所以要根据自身情况来设置合适的大小。

2. 创建表

CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR(200),body TEXT,auth VARCHAR(30),FULLTEXT (title,body) WITH PARSER ngram   //这里声明使用分词引擎n-gram) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

如果是已经创建的表可以使用

ALTER TABLE table_name ADD FULLTEXT INDEX ft_name  (`name`, `company_code`, `office_address`) WITH PARSER ngram;

最后记得 OPTIMIZE TABLE table_name 重建索引(需要定期执行)

3. 显式指定全文检索表源 (这是一个非常有用的调试工具。如果我们发现一个包含某个词的文档,没有如我们所期望的那样出现在查询结果中,那么这个词可能是因为某些原因不在全文索引里面。)

mysql> SET GLOBAL innodb_ft_aux_table="new_feature/articles";   //new_feature为数据库名称, articles为表名称
Query OK, 0 rows affected (0.00 sec)

通过系统表,就可以查看到底是怎么划分articles里的数据。

mysql> SELECT *FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20,10;

我们可以通过查询INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE和INFORMATION_SCHEMA.INNODB_FT_TABLE_TABLE来查询哪些词在全文索引里面。

查询:

1.自然语言模式下检索:

  • 得到符合条件的个数

    mysql>SELECT COUNT(*) FROM articles
    -> WHERE MATCH (title,body) AGAINST ('数据库' IN NATURALLANGUAGE MODE);
    +----------+
    | COUNT(*) |
    +----------+
    |       4  |
    +----------+
    1 row in set (0.05 sec)

  • 得到匹配的比率
     mysql>SELECT id, MATCH (title,body) AGAINST ('数据库' IN NATURAL LANGUAGE MODE)AS score FROM articles;
    +----+----------------------+
    | id| score                |
    +----+----------------------+
    |  1 | 0.12403252720832825 |
    |  2 | 0.12403252720832825 |
    |  3 |                   0 |
    |  4 | 0.12403252720832825 |
    |  5 | 0.062016263604164124|
    |  6 |                   0 |
    +----+----------------------+
    6rows in set (0.00 sec)

2.布尔模式下搜索,这个就相对于自然模式搜索来的复杂些:

  • 匹配既有管理又有数据库的记录

    mysql> SELECT * FROM articles WHERE MATCH (title,body)->     AGAINST ('+数据库 +管理' IN BOOLEAN MODE);
    +----+------------+--------------------------------------+
    | id| title      | body                                  |
    +----+------------+--------------------------------------+
    |  1 | 数据库管理  | 在本教程中我将向你展示如何管理数据库       |
    +----+------------+--------------------------------------+
    1 rowin set (0.00 sec)

  • 匹配有数据库,但是没有管理的记录
    mysql> SELECT * FROM articles WHERE MATCH (title,body)->     AGAINST ('+数据库 -管理' IN BOOLEAN MODE);
    +----+------------------+----------------------------+
    | id| title             | body                       |
    +----+------------------+----------------------------+
    |  2 | 数据库应用开发     | 学习开发数据库应用程序         |
    |  4 | 数据库与事务处理   | 系统的学习数据库的事务概论      |
    |  5 | NoSQL 精髓       | 学习了解各种非结构化数据库      |
    +----+------------------+----------------------------+
    3 rows in set (0.00 sec)

  • 匹配MySQL,但是把数据库的相关性降低
    mysql> SELECT * FROM articles WHERE MATCH (title,body)->     AGAINST ('>数据库 +MySQL' INBOOLEAN MODE);
    +----+---------------+-----------------+
    | id| title          | body            |
    +----+---------------+-----------------+
    |  3 | MySQL完全手册  |学习MySQL的一切    |
    +----+---------------+-----------------+
    1 rowin set (0.00 sec)

代码参考:https://blog.csdn.net/zwrj1130/article/details/55506179

https://www.cnblogs.com/zhoujinyi/p/5643408.html

转载于:https://www.cnblogs.com/xiaoliwang/p/8887873.html

Mysql 索引 n-gram分词引擎使用相关推荐

  1. MySQL索引、事务与引擎基础详解,理论加实例

    目录 一.索引 1.1普通索引 1.2唯一性索引 1.3主键索引 1.4组合索引 1.5全文索引 1.6索引的查看 1.7索引的删除 二.事务 2.1事务的ACID特点 2.2事务控制语句 2.3事务 ...

  2. MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景

    1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...

  3. Mysql 索引 总结 —— 概述 || 索引优势劣势|| 索引结构(索引是在MySQL的存储引擎层中实现的)|| BTREE 结构||B+TREE 结构||MySQL中的B+Tree||索引分类

    索引概述 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序). 在数据之外,数据库系统还维护者满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向 ...

  4. mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略

    存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...

  5. mysql5.5索引如何定义_MySQL5.5索引数在InnoDB引擎内与索引数在mysql中定义的数量是不一致问题-阿里云开发者社区...

    在查看MySQL错误日志的时候发现这样的错误,如下: 160322 21:42:59 [ERROR] Table baby/baby_order contains 12 indexes inside ...

  6. mysql索引与事务笔记_《MySQL技术内幕:InnoDB存储引擎》读书笔记五-锁、索引及事务...

    1.锁mysql 1)锁是数据库系统区别于文件系统的一个关键特性,数据库使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性.算法 2)每一种数据库实现锁的方式都不一样.sql 共享锁:容 ...

  7. 理论+实操: MySQL索引与事务、视图、存储过程(软件开发用的多)、存储引擎MyISAM和InnoDB

    文章目录 一:索引的概念 二:索引的作用 三:索引的分类 3.1 普通索引 3.2 唯一性索引 3.3 主键 3.4 全文索引 3.5 单列索引与多列索引 四:创建索引的原则依据 五:创建索引的方法 ...

  8. Java 培训 MySQL 体系构架、存储引擎和索引结构

    对某项技术进行系统性的学习,始终离不开对该项技术的整体认知.只有领略其全貌,方可将各块知识点更好的串联起来.为了进一步理解和学习 MySQL,我们有必要了解一下 MySQL 的体系构架.存储引擎和索引 ...

  9. 数据库之Mysql索引、事务与存储引擎

    目录 1 MySQL索引 1.1 索引的概念 1.2 索引的作用 1.3 创建索引的原则依据 1.4 索引的分类和创建 普通索引 唯一索引 主键索引 组合索引(单列索引与多列索引) 全文索引(FULL ...

最新文章

  1. Jquery中获取select选中的文本与值
  2. Coding Party 邀你出战!飞桨黑客马拉松线下场来啦
  3. java连接ldap验证,验证用户使用LDAP登录
  4. python实现web服务器_python实现静态web服务器
  5. hdu 1217 Arbitrage (最小生成树)
  6. 【分享用于学习C++图像处理的代码示例】框架
  7. python 二维矩阵画三维图_python 二维矩阵转三维矩阵示例
  8. 《大数据技术原理与应用》(第三章 HDFS 课后答案)
  9. DBeaver出现:The Network Adapter could not establish the connection 已解决
  10. 张国荣一生57部电影海报全集
  11. 手机刷机软件与ROM的盈利模式分析
  12. web buuctf [0CTF 2016]piapiapia
  13. 最速降线问题-泛函极值
  14. anistropic filer
  15. matlab电影,如何制作电影(与matlab相关)?
  16. Spring Boot拦截器(Interceptor)详解
  17. 自动驾驶行业观察之2023上海车展-----车企发展趋势(1)
  18. 短视频如何做好引流与推广,分享四个快速涨粉方案
  19. U8标准接口API使用-生产订单
  20. 多源数据的融合发展现状与趋势(一)——多源数据介绍

热门文章

  1. clickhouse原理解析与应用实践_Hybrid App (混合应用) 技术全解析 方案原理篇
  2. new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool
  3. 计算机入域时域控用到的端口,【ADDC】域控需要开放的端口
  4. win7系统服务器环境配置,windows7系统安装与配置Tomcat服务器环境
  5. android intent 跳转卡顿_Intent七大属性
  6. wav音量和分贝转换关系_电吉他音箱瓦数与音量大小之间的关系
  7. php 浏览器 兼容,兼容ie6浏览器的php下载文件代码分享
  8. python找出文本的位置和替换_python查找文本文档中特定间隔位置的字符并替换
  9. Asp.net就业课之Ado.net第一次课
  10. Linux 的cp命令