Mysql
為儲存唯一雜湊值的列正確使用 FULLTEXT 索引
我們有一個名為 的 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')
但是這個查詢不返回任何結果。當我檢查 use
EXPLAIN
時,我得到:**id** 1 **select_type** SIMPLE **table** user **type** fulltext **possible_keys** token **key** token **key_len** 0 **ref** NULL **rows** 1 **Extra** 使用 where
在這裡,即使沒有返回結果,
key_len
0 並說 1 對我來說也是可疑的。rows
現在我認為即使 FULLTEXT 也不是解決方案 - 它似乎不適用於沒有常用詞的完全獨特的值 - 不是常用的文本。
你能幫我理解嗎:
- 為什麼
FULLTEXT
index withMATCH() AGAINST()
沒有帶來任何結果?token
索引欄位和減少查詢時間的最佳方法是什麼?
不,我“無法想像”。也就是說,除非您沒有 ,否則
INDEX(token)
該索引會很快。不要FULLTEXT
在這種情況下使用。如需進一步討論,請提供
SHOW CREATE TABLE
和EXPLAIN SELECT
的情況token = '...'
。