mysql> create table `table_a` (
`id` int(11
) not null,
`b` varchar(10
) default null,
primary key (`id`)
,key `b` (`b`)
) engine=innodb;
執行sql, mysql> select * from table_a where b=『1234567890abcd』;
假設現在表裡面,有 100 萬行資料,其中有 10 萬行資料的 b 的值是』1234567890』,假設現在執行語句是這麼寫的:
這時候,mysql 會怎麼執行呢?
最理想的情況是,mysql 看到字段 b 定義的是 varchar(10),那肯定返回空呀。可惜,
mysql 並沒有這麼做。
那要不,就是把』1234567890abcd』拿到索引裡面去做匹配,肯定也沒能夠快速判斷出
索引樹 b 上並沒有這個值,也很快就能返回空結果。
但實際上,mysql 也不是這麼做的。
這條 sql 語句的執行很慢,流程是這樣的:
在傳給引擎執行的時候,做了字元截斷。因為引擎裡面這個行只定義了長度是 10,所
以只截了前 10 個位元組,就是』1234567890』進去做匹配;
因為是 select *, 所以要做 10 萬次回表;
但是每次回表以後查出整行,到 server 層一判斷,b 的值都不
是』1234567890abcd』;
返回結果是空。
mysql sql執行慢 分析過程
為了驗證select 1 與 select 1 from tablename 與 select from tablename的執行效率,需要測試一下各自執行的時間。於是總結一下,檢視mysql語句執行時間的方法。方法一 show profiles。1.show profiles是5.0.37之後新增...
MySQL SQL執行計畫分析
當我們的系統上線後資料庫的記錄不斷增加,之前寫的一些sql語句或者一些orm操作效率變得非常低。我們不得不考慮sql優化,sql優化大概是這樣乙個流程 1.定位執行效率低的sql語句 定位 2.分析為什麼這段sql執行的效率比較低 分析 3.最後根據第二步分析的結構採取優化措施 解決 而explai...
MySQL SQL執行計畫
sql的執行 通訊階段 查詢快取 解析器進行驗證解析,基於語法戒心和詞法解析得到解析樹 優化器,優化執行階段找到sql的最優執行方式 執行器執行計畫 用explain或者desc檢視sql的執行計畫 執行計畫引數 id sql執行的順序,值大的先執行,id一樣的話,按照順序從上至下執行 select...