我有一個小問題,真的很感謝幫助。MySQL數字版相關搜索性能?
我有包含具有以下數據結構33000000行MyISAM表:
id -> Primary Key, Unsigned INT, Auto-Increment
characters -> Unique Indexed, varchar(15)
price -> decimal (10,2)
active -> tinyint(1)
我已經寫了一個腳本,從用戶採取搜索值,然後創建下面的查詢,基於所述用戶輸入在「凱文」:
SELECT characters, price
FROM listings_dvla
WHERE active=TRUE
AND LOWER(REPLACE(characters, ' ', '')) REGEXP '^[a-z0-9]*[(k)]+[a-z0-9]?[(e)(3)]+[a-z0-9]?[(v)]+[a-z0-9]?[(i)(1)]+[a-z0-9]?[(n)(11)(1v)]+[a-z0-9]*'
ORDER BY characters ASC
LIMIT 0, 12
只是爲了說明,正則表達式只是想匹配,以便每個字母,或意味着在「號牌的語言」,例如相同的字母序列。 N == 1V
事情是,這個查詢需要上帝該死的年齡! 20+秒。我一直在閱讀相當數量的文章,並發現將字符作爲主鍵的速度較慢,因此我將其添加並添加了一個ID字段。我使用了EXPLAIN,它顯示了索引,它們是NULL,我假設這是因爲REGEXP禁用它們(我也在某處讀過)。
我的問題是,有沒有人有任何明智的想法,嚴重增加這種查詢性能?因爲我覺得我不知道讓這個更快的事情非常重要。
如果需要,我會改變表格結構,所以不要擔心給我一個相當極端的答案。
感謝您閱讀本文,非常感謝您的任何建議。
如果刪除字符列上的LOWER和REPLACE,時間是否有所不同?通常,您希望避免對where子句中的列執行字符串操作,因爲索引不太可能被使用。還可以用直接的'characters ='kevin'或完全匹配的東西來測試。您可能更適合在代碼中調整用戶輸入,而是運行多個查詢,而不是執行正則表達式匹配的一個查詢,並操縱您搜索的列。 – nos