Mysql 索引 n-gram分词引擎使用
概述:
類似于書籍的目錄,找到一本書的特定內容,需要首先找到內容對應頁碼,定位對應頁碼
存儲引擎使用類似方法進行數據查找,先找到索引中對應值,然后根據匹配的索引找到對應行
?
實現原理:
索引的實現通常使用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分词引擎使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC使用终端DISKUTIL命令给U盘
- 下一篇: 电子邮件收发原理和实现(POP3, SM