為什麼 MySQL 的優化器不能做智慧型的型別轉換

時間 2021-06-05 12:20:06

1樓:聿明leslie

MySQL做得最靈活的就是資料型別,幾乎每種型別都可以做相容計算,相容計算帶來的壞處就是很多SQL寫得不嚴格的話,執行不會報錯,但是可能執行效率不會太好。SQL裡面的表示式計算和程式語言裡的型別計算是同乙個道理,要做計算前需要做相容型別提公升,只有提公升到相同型別才能做表示式運算,我們將提公升型別稱為關係運算f那麼兩個A B值得等值關係就有f(A)=f(B)

對於你這裡的等值其實就是f(user_id)=f(10000),user_id和int的相容比較型別是bigint,也就說當左邊的列型別是varchar,而右邊值型別是int型別族裡的任何乙個型別,最終都需要轉換到bigint去做比較,所以f(user_id)其實就是cast(user_id as signed),這是執行器內部的隱式轉換,所以這裡我們可以看出,當varchar列的值為'10000','010000','0010000',以此類推上面這個等式都成立,所以和10000相等的varchar值很多,而是否能走索引,取決於能否從等值中提取出有限個常量值去btree索引上查詢,我們把這個求解常量的過程稱為extract range,在OB中這個模組叫query range,從上面的數學關係可以看出,從右往左的對映關係存在一對多,從這個表示式可以看出,左邊可以提取出無窮個可能滿足這個等式的值來,所以無法得到有限個可能的值去查索引,自然的,user_id=10000這個條件無法走索引,而user_id='10000'由於兩邊型別相同,不需要做相容型別提公升,所以左邊能反推出來滿足這個關係的值只有'10000',拿這個值去查索引是很容易的,這是extract range的關係,跟型別轉換無關。

MySQL 索引優化器選擇索引的規則是什麼?

mysqlops MySQL的優化器不是簡單基於規則或 CBO 基於成本 而混合之用,但是傾向於基於成本優化為主的模式,但是一般都會根據統計資訊,以及 SQL語句的成本,甚至伺服器的空閒程度而選擇乙個合適的計畫.並且mysql對SQL語句會進行改寫的,對於執行計畫有三個相關的引數 optimizer...

為什麼我不能做的完美?

莊曉夢 因為沒有人是完美的啊,必須接受這個事實。你不完美,別人也不會討厭你,或者覺得你做得不好,所以要接納自己,愛自己。不要怕被拒絕。 久等 你是指 考試最多考到第二 考試從未滿分 字寫的總是很醜 長得不帥 作業容易出一些無關緊要的小錯誤或者細節性錯誤 計算能力超差 背的文章總是不能完整背下來 玩不...

為什麼不能做連續的夢?

Zzxxxx 怎麼能夠證實的。不能做連續的夢的。每次做完夢之後。夢境不會長久的儲存在記憶中下就算下次再進行也不會記得了。以前見過乙個問題 問為什麼每次做夢到危險的地方就會驚醒,或被他人叫醒或自己甦醒,到底是真的趕的準甦醒,還是每次驚醒之後只能記得記憶最深刻的那一段夢境,所以醒來之後以為剛夢到那裡 M...