您好,登錄后才能下訂單哦!
MYSQL中的查詢技巧及如何進行MYSQL 8 并行查詢,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
最近公司的系統一點點的開始了拆分,從ORACLE 轉移到 MYSQL 中,部分程序員的想法在使用MYSQL中還是沒有轉變過來,直接將ORALCE中的查詢語句直接搬到了MYSQL。使用MYSQL 重要的兩點,1 邏輯上移,數據庫不在是承擔你邏輯的第一選擇,程序的比重將變得更重要 2 數據庫容器化,數據庫將變得不再那么重要,而是僅僅是承載數據的地方,或者甚至高級的設計,數據庫將變得可有可無,這當然也的和業務掛鉤,不是放之四海都OK。
這就直接拋出一個問題,就是MYSQL的查詢技巧還重要嗎?當然如果你還要用MYSQL 來進行數據庫的提取和查詢,那就必須重視MYSQL的查詢技巧。
下圖是以 mysql 8.015 這個版本作為語句執行的基礎
其實兩條語句查詢的結果是一樣的,僅僅是寫法不一樣,給出的執行計劃就是不一樣的
以目前最新版本的MYSQL來說,從上面的例子里面,還是要鼓勵直接查詢,盡量避免子查詢。當然如果子查詢能大幅度的降低參與計算的數據量,則還是可以對比繼續使用的。
下面我們可以看看MYSQL 中的index merge 的功能到底能提升查詢性能多少
1 我們先關閉index_merge
很明顯,索引都白搭了
2 我們打開index_merge
明顯看到,查詢中使用or 的時候index merge 對數據查詢的幫助是很大的
實際當中,(SSD 硬盤 440行數據的 fetch 不開啟 0.195秒相當于全表掃描,開啟0.001秒)
mysql 8 是默認開啟的。
3 時間范圍對選擇索引的影響
下面兩條語句對于索引的選擇會截然不同,我們建立四個索引
Select * from employees where first_name ='Georgi' or last_name ='Preusig' and birth_date > '1950-01-01' and birth_date < '1950-01-02';
select * from employees where first_name ='Georgi' or last_name ='Preusig' and birth_date > '1950-01-01' ;
從上圖可以看出由于時間范圍,最后走了不同的索引,后面其實我還做了一些其他的測試,例如將時間的范圍擴大,發現目前的MYSQL 8.015 很聰明的走了應該走的索引,看了MYSQL8.0 這個版本的查詢優化器要比MYSQL 5.7 進步不少。
最后,我們看看MYSQL 8.0的并行查詢,并行查詢,其實在 PG, SQL SERVER , ORACLE 中都有,但形式不同,MYSQL 8 之前是沒有并行查詢這個概念的,MYSQL 8 引入了并行查詢,我們看看到底并行查詢,對查詢有什么幫助。
首先我們將并行度降低到 1 ,默認是 4 查詢后,獲得的時間是 0.109秒 然后我們將并行度調整為 6 在次查詢,獲得的時間是 0.062秒
由此可見并行度這個東西,對于查詢是有幫助的,尤其count(*) 這樣經常被詬病的查詢方式也在并行度中獲益。
如果你經常觀察MYSQL 和 POSTGRESQL ,你就會感到開源數據庫越來越強大,留給ORACLE 和 SQL SERVER 這樣數據庫的時間其實不多了。
關于MYSQL中的查詢技巧及如何進行MYSQL 8 并行查詢問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。