概述:

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

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

实现原理:

  索引的实现通常使用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-gramparser ,我们可以用他轻松的实现分词功能

使用方法:

注意:
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_CACHEINFORMATION_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

Mysql 索引 n-gram分词引擎使用的更多相关文章

  1. MySQL索引底层实现

    一.定义 索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构.本质:索引是数据结构. 二.B-Tree m阶B-Tree满足以下条件: 每个节点至多可以拥有m棵子树. 根节点,只有至少 ...

  2. MySQL索引基础知识点

    什么是索引 索引类似于书本目录,是数据库存储引擎维护的用于快速查找到记录的一种数据结构,它是对查询性能优化的最有效手段. MySQL索引是在存储引擎层而不是服务器层实现的,不同存储引擎的索引工作方式也 ...

  3. Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置

    一.MySQL索引创建与删除 目标: 本案例要求熟悉MySQL索引的类型及操作方法,主要练习以下任务: 普通索引.唯一索引.主键索引的创建/删除 自增主键索引的创建/删除 建立员工表yg.工资表gz, ...

  4. MYSQL索引类型。MYSQLc储存引擎

                                                            MYSQL索引类型,MYSQLc储存引擎 MySQL索引创建与删除 MySQL存储引擎的 ...

  5. MySQL索引及优化(1)存储引擎和底层数据结构

    在昨天的面试中问到了MySQL索引怎么优化(查询很慢怎么办),回答的很不理想,所以今天来总结几篇关于MySQL索引的知识. 1.什么是索引? 首先我们一定要明确什么是索引?我自己的总结就是索引是一种数 ...

  6. MySQL索引、事务、存储引擎

    一.MySQL 索引 1.索引的概念 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址).●使用索引后可以不用扫描 ...

  7. 【MySQL】MySQL(四)存储引擎、索引、锁、集群

    MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...

  8. MySQL 索引、事务与存储引擎

               MySQL 索引.事务与存储引擎 1.索引 2.事务 3.存储引擎 1.索引: 索引的概念 : 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 ...

  9. 27.MySQL 索引、事务与存储引擎

    MySQL 索引.事务与存储引擎 目录 MySQL 索引.事务与存储引擎 MySQL 索引 索引的概念 索引的作用及副作用 索引的作用 索引的副作用 创建索引的原则依据 索引的分类和创建 普通索引 唯 ...

随机推荐

  1. 18年春招某编程题:有三个整数X,Y,Z,要求进行若干次操作使得X,Y,Z相等

    题目描述: 给定三个整数X,Y,Z,要求进行若干次操作使得X,Y,Z相等,操作有两种: 1.从X,Y,Z中选择两个数都加1. 2.从X,Y,Z中选择一个数加2. 求最少需要多少次操作. 题目思路: 1 ...

  2. windows下网络丢包模拟软件(Network Emulator for Windows Toolkit)

    最近公司有一个直播的测试项目,需要模拟各种网络环境下的直播状态,最后找到一款这样的软件(如果有遇到更好的软件,望和网友多多交流) 介绍一款windows下的网络模拟器,可以模拟各种丢包或延迟的网络(N ...

  3. P1916小书童--大战蚂蚁

    链接 题解:(这里蚂蚁0血也算活...) #include<iostream>#include<cstdio>#include<cmath>using namesp ...

  4. 阿里云ECS安装Kubernetes问题收集与解答

    问题1 kubernetes pod启动报错open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such fil ...

  5. C语言强化——数组

    打印九九乘法表 #include<stdio.h> int main() { int num = 1; for (int i = 1;i <= 9;++i) { for (int j ...

  6. 事件之父View和子view的点击事件的执行过程

    Android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN-& ...

  7. [UE4]更新UI的三种方式

    一.函数绑定 二.属性绑定 只会列出匹配的数据类型. 三.事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用.事件驱动更新的效率最好,性 ...

  8. 【PHP】五分钟教你编写一个实时弹幕网站

    由于博主是个忠实的英雄联盟粉丝,所以经常观看一些明星大神的直播.而一谈到直播,肯定会看到满屏幕飘来飘去的弹幕.那么问题来了,这些视频弹幕网站如何做到实时同步的?PHP如何开发一个类似的网站? 首先要搞 ...

  9. IBM MQ 中 amqsput : command not found的解决办法

    MQ操作队列的命令有如下三条:命令功能1.amqsput   将消息放入队列中, 程序把之后的每一行标准输入作为一条独立的消息,读到 EOF 或空行时退出.注意,UNIX 上的 EOF 为 Ctrl+ ...

  10. dspmq dspmqver command not found(dspmq命令找不到,dspmqver主安装目录设置不正确

    [root@rhv6-64b ~]# su - mqm -bash-4.1$ dspmq -bash: dspmq: command not found(dspmq命令找不到) -bash-4.1$ ...