當我針對整數查詢 varchar 列(索引)時,它運行得非常慢。我認為 mysql 能夠推斷出這一點并將引數轉換為字串,但是當我使用整數進行過濾時,它會避免索引。
這個可以嗎?是排序問題嗎?我應該總是手動將整數轉換為字串以使 varchar 索引起作用嗎?
運行 mysql 5.7
varchar 列是一個外部 id,我們不控制它是整數還是字母數字。有時用戶想通過我們的內部整數 id 來查找物件,有時通過他們的 id,所以我們使用: WHERE id = ? 或 external_id = ?
uj5u.com熱心網友回復:
它在這里說:
在所有其他情況下,引數將作為浮點(雙精度)數字進行比較。例如,字串和數字運算元的比較是作為浮點數的比較進行的。
由于您正在將字串列與整數常量進行比較,因此 MySQL 必須將列中的每個值轉換為浮點數以進行比較,并且可能不使用索引(如果反過來,即整數列與字串相比,情況可能會有所不同持續的)。
但更重要的是,這樣的比較會產生意想不到的結果:
select '123abc' = 123 -- true
話雖如此,改變這一點并不難:
select '123abc' = 123 -- true
對此:
select '123abc' = '123' -- false
uj5u.com熱心網友回復:
問題不在于資料型別或排序規則,而是您OR用于搜索兩個不同列的事實。
考慮這個類比:假設我讓你在電話簿中找到名叫 Gammel 的人。你問,“那是姓還是名?” 我回答:“請找出所有案例,無論是名字還是姓氏。”
現在你有問題了。
SELECT ... FROM telephone_book
WHERE last_name = 'Gammel' OR first_name = 'Gammel';
這本書是按姓氏排序的,所以應該很快就能找到與姓氏相匹配的條目。但我也要求所有與名字匹配的人。對于任何姓氏的人,這些可能會在整本書中隨機分布。您現在將不得不艱難地搜索這本書,一次一頁。
OR優化問題的一個常見解決方案是使用UNION兩個單獨的查詢來搜索各自的索引。
SELECT ... FROM telephone_book
WHERE last_name = 'Gammel'
UNION
SELECT ... FROM telephone_book
WHERE first_name = 'Gammel';
假設 上有一個不同的索引first_name,這個聯合中的后一個查詢將使用它以優化的方式查找與名字匹配的條目。我們已經知道它可以為姓氏做到這一點。
然后,一旦找到匹配任一條件的(希望很小的)行子集??,這些集合就會合并到一個結果中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453096.html
