日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql 索引 n-gram分词引擎使用

發布時間:2024/1/17 数据库 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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分词引擎使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。