之前在做專案的時候,接觸到的千萬級以上的表資料不是太多,對於聯合索引的認知不是太深刻,用索引與不用索引以及索引的建立順序和規則之前的區別不是太明顯,最近手頭有優化查詢千萬級資料量的慢sql的任務,優化前,查詢時間達到了60秒,導致前端請求掛起,做了相應的優化後,查詢千萬級別資料時,速度基本保持在零點幾秒到兩點幾秒之間。
1select2*
3from
4table
5where
6 field1 =
'bf1adfe6_f71a_11e6_b131_6c92bf2bf639'7
and field_time >=
'2018-10-09 00:00:00'8
and field_time <=
'2018-10-15 23:59:59'9
and field3 like concat('
模糊查詢字段
', '%'
)10order
by11 field_time desc
12 limit 0,13
5;1415
select16*
17from
18table
19where
20 field1 =
'bf1adfe6_f71a_11e6_b131_6c92bf2bf639'21
and field_time >=
'2018-10-09 00:00:00'22
and field_time <=
'2018-10-15 23:59:59'23
and field3 like concat('
模糊查詢字段
', '%'
)24order
by25 field_date desc
26 limit 0,27
5;2829
3031
select32*
33from
34table
35where
36 field1 =
'bf1adfe6_f71a_11e6_b131_6c92bf2bf639'37
order
by38 field_date desc
39 limit 0,40
5;
field1、field_time是必填字段,field3 是非必填字段。
當查詢的總條數少於5條時,查詢時間會達到60秒左右,資料量有一千多萬條。原因是當查詢總數少於5條時,會掃瞄全表的資料。
第乙個sql,field_time範圍查詢欄位和排序欄位是乙個字段,也有對應的索引,如果field1 、field_time設定為單列索引,則會根據field1通過索引過濾一部分資料,在通過field_time對應的索引進行排序,這會更多的消耗資料庫記憶體,把field1 、field_time設定為聯合索引,則相當於建了field1 索引、(field1 、field_time)索引,共兩個索引,然後再建乙個(field1 、field_time、field3)索引, 這樣會大大提高查詢效率,測試結果也是如此,提高6秒左右。
第二個sql,中排序的時間欄位和範圍查詢時間字段不是同乙個字段,而這兩個欄位都有相應的索引,這樣會導致經過過濾查詢出來的資料再次進行時間上的排序,是比較消耗資料庫記憶體,影響查詢效率的。盡量考慮用同乙個時間字段。
第三個sql,則沒有太多的糾結了,直接用(field1 、field_date)索引就可以了,根據最左字首規則。
sql查詢時,模糊查詢中查詢的資料量不同,那麼用到的索引也不盡相同,公司的dba工程師和從網上查詢的結論是mysql資料庫通過內部自己判斷最優使用索引,從而來決定使用哪個索引,但是它是否選擇的正確也不一定,所以有時候可以是用force來強制是用合適的索引,但是不提倡使用,如果相應的索引被dba給刪除了,程式就會報錯了。這時候原本查詢千萬級別資料時,有可能就會從毫秒級別上公升為秒級別了,比如前面說的有時候會達到一秒或兩秒左右。
我問dba,如果field_time有的為空,會不會是索引不生效,dba說不會,只是如果為空的情況下,這個為空的資料不會被計算在內。
索引如果用的比較好,那麼在操作千萬級別甚至億級別的資料時,也是可以很快的。當查詢的資料量越多時,用聯合索引查詢的速度會越快。以後還得好好深入研究這方面的知識啊,生命有限,知識無涯啊!
可以用下面的方法讓你的大腦就範
全文摘錄自 head first python 1 慢一點。你理解的越多,需要記的越少。不要光是看看就行了。停下了,好好想一想。書中提出問題的時候,你不要直接去翻答案。可以假象真的有人在問你這個問題。你讓大腦想得越深入,就越有可能學會並記住它。2 做練習,自己記筆記。我們留了練習,但是如果這些練習的...
可以讓你暈的手機簡訊
1 恭喜你呀!你老婆剛剛在醫院為你生了個大胖小子,你出去都兩年多了,也不回家看看。2 有一天,我和你去探險,遇到了乙個食人妖,它先用鼻子聞了聞你,再用鼻子聞聞我,然後選擇吃我,我覺得不公平,就問它為什麼,它說它是回族的 3 一人喝得爛醉坐車回家,司機是位女士,這人上了車就 服,女司機質問他的行為,他...
可以讓你心動的微眾銀行
眾所周知,在過去,我們幾乎都是到櫃檯獲取金融服務,自網際網路金融科技的發展,自支付寶和微信的出現,過去的那種金融服務也慢慢的被人工智慧所代替。微眾銀行在這種情況下應運而生,微眾銀行自 2014 年成立以來,就開始服務於人民,作為國內首家民營銀行和網際網路銀行,微眾銀行致力於為普羅大眾 微小企業提供差...