Mysql

為儲存唯一雜湊值的列正確使用 FULLTEXT 索引

  • November 10, 2018

我們有一個名為 的 InnoDB 表user,其中有一個名為token(varchar(128)) 的列,其中儲存了一個唯一的類似 md5 的值,該值表示使用者是否經過身份驗證。此列可以填充或為空/NULL,具體取決於使用者是否已通過身份驗證。

每當呼叫 API 對其他數據進行更改時,我們總是檢查隨 API 發送的令牌是否有效。查詢將類似於:

select * 
from `user` 
where token ='96e1e3c72ce665bc7aeb93a357801fa3296e500b1aed8016e5342e744990cd0094c98857ae5f4b0a73cc6dfebd11a8491a5ba8448e6ddff8a631eb8213c254d0'

可以想像,這個查詢會在幾秒鐘內執行,因為它是對 varchar 欄位的查詢。現在我正在嘗試修復查詢速度。

我嘗試在該token欄位上添加 FULLTEXT,但它對=查詢沒有幫助。所以我嘗試使用MATCH() AGAINST()如下查詢:

select * 
from `user` 
where MATCH(token) AGAINST('96e1e3c72ce665bc7aeb93a357801fa3296e500b1aed8016e5342e744990cd0094c98857ae5f4b0a73cc6dfebd11a8491a5ba8448e6ddff8a631eb8213c254d0')

但是這個查詢不返回任何結果。當我檢查 useEXPLAIN時,我得到:

**id** 1
**select_type** SIMPLE
**table**  user
**type** fulltext
**possible_keys** token
**key** token
**key_len** 0
**ref** NULL
**rows** 1
**Extra** 使用 where

在這裡,即使沒有返回結果,key_len0 並說 1 對我來說也是可疑的。rows

現在我認為即使 FULLTEXT 也不是解決方案 - 它似乎不適用於沒有常用詞的完全獨特的值 - 不是常用的文本。

你能幫我理解嗎:

  1. 為什麼FULLTEXTindex withMATCH() AGAINST()沒有帶來任何結果?
  2. token索引欄位和減少查詢時間的最佳方法是什麼?

不,我“無法想像”。也就是說,除非您沒有 ,否則INDEX(token)該索引會很快。不要FULLTEXT在這種情況下使用。

如需進一步討論,請提供SHOW CREATE TABLEEXPLAIN SELECT的情況token = '...'

引用自:https://dba.stackexchange.com/questions/222236