1. 程式人生 > >MYSQL --SQL優化流程

MYSQL --SQL優化流程

常去想想以前的東西,懷舊不是用感傷的,是溫故知新,加油!!!

一、分析一個SQL:

1.先看錶結構,美化一下,一個好看的結構會讓人心曠神怡

2.對複雜的SQL進行分析

(1)儘量將複雜的SQL拆成幾個簡單的查詢

(2)儘量使用表連線,減少使用過 in/not in

(3)儘量減少子查詢的使用或者將其合併出來

(4)儘量將 in/ not in /exists/not exists變為 join 語句,減少/合併子查詢

3.從MySQL 5.6開始,子查詢處理變得相對智慧,利用其進行優化

(1)注意空值變化

(2)適當進左連線

(3)將SQL進行不同方式靈活轉換,測試效能

4.檢視慢查詢日誌,主要看兩個地方

i. Row examined(最終要依據)

ii. Query time

5.SQL對系統可擴充套件性的影響

是否產生了慢查詢,產生全表掃描,時間
中介軟體的影響

二、 分析SQL表連線圖,畫出拓撲圖,找出主外來鍵:

三、 找出返回資料最少的那張表

四、是否有高效索引

1、 高效索引:where條件都在索引上,或者通過索引過濾更多的資料,減少通過索引訪問資料的再次過濾

2、有索引的where條件通過索引訪問表上的資料

3、沒有索引的where條件是通過where過濾資料

五、在表連線順序確定的情況下,確定被連線的表是否存在索引

六、進一步檢視是否覆蓋索引

七、對索引效果不好的情況,是否需要進行表分割槽?

八、是否進行逆正規化化進行?

九、對錶進行水平和垂直拆分

注意:必須有主鍵,儘量保證業務的均勻分配,優先考慮tps

十、注意書寫規範!!!!!!!

1.%開頭的問題!!!

2.字元列上面沒有加引號!!!

where條件不能有計算與函式處理 !!

十一、索引失效原因

1.沒有查詢條件,或者查詢條件沒有建立索引

2.查詢條件上沒有使用引導列,多列索引沒有正確被使用(where條件沒有寫前導列)

3.查詢的數量是大表的大部分

如果有主鍵索引,都要走主鍵索引
對於二級索引,如果訪問量大,會全表掃描

4.索引本身失效

5.查詢條件使用函式或者計算

6.對於小表進行查詢

7.忽略索引的問題

8.隱式轉換導致索引失效!!!!!

數字列不害怕隱式轉換
字元列害怕隱式轉換

9.<>不等於號不一定不走索引

10.%開頭的情況,索引一定失效

11.not in /not exists 多數情況下不走索引

12.當變數是times型別,表字段是data的時候,或相反情況下,索引失效。而且如果資料填充進去也不對

13.注意非空的情況,B-tree索引處理的不是很好

相關推薦

MYSQL --SQL優化流程

常去想想以前的東西,懷舊不是用感傷的,是溫故知新,加油!!! 一、分析一個SQL: 1.先看錶結構,美化一下,一個好看的結構會讓人心曠神怡 2.對複雜的SQL進行分析 (1)儘量將複雜的SQL拆成幾個簡單的查詢 (2)儘量使用

mysql sql優化

ner jdbc連接 htm database 提升 第一個 記錄 blog bat 記錄一些經驗,主要是結論。建檢索等就不寫了,地球人都知道。 1. 對比2個join select * from (select * from A where age > 10

MySQL sql優化

每一個 where子句 掃描 href 在服務器 掃描表 優化 str 響應 sql優化10條建議 1.將經常要用到的字段(比如經常要用這些字段來排序,或者用來做搜索),則最好將這些字段設為索引。2.字段的種類盡可能用int 或者tinyint類型。另外字段盡可

MySQL--------SQL優化審核工具實戰

mysql dba sqladvisor 1. 背景 SQLAdvisor是由美團點評公司技術工程部DBA團隊(北京)開發維護的一個分析SQL給出索引優化建議的工具。它基於MySQL原生態詞法解析,結合分析SQL中的where條件、聚合條件、多表Join關系 給出索引優化建議。目前SQLAdvis

mysql sql優化sql執行計劃

mysql 執行計劃SQL優化禁用SELECT *使用SELECT COUNT(*) 統計行數盡量少運算盡量避免全表掃描,如果可以,在過濾列建立索引盡量避免在WHERE子句對字段進行NULL判斷盡量避免在WHERE子句使用!= 或者<>盡量避免在WHERE子句使用OR連接盡量避免對字段進行表達式計

MySQL SQL優化之‘%’

sql優化設計索引的主要目的就是幫助我們快速獲取查詢結果,而以%開頭的like查詢則不能夠使用B-Tree索引。考慮到innodb的表都是聚簇表(類似於oracle中的索引組織表),且二級索引葉節點中記錄的結構為(索引字段->主鍵字段),我們可以通過改寫sql(mysql優化器比較笨,需要給它足夠的提示

Mysql SQL優化系列之——執行計劃連線方式淺釋

關係庫SQL調優中,雖然思路都是一樣的,具體方法和步驟也是大同小異,但細節卻不容忽視,尤其是執行計劃的具體細節的解讀中,各關係庫確實有區別,特別是mysql資料庫,與其他關係庫的差別更大些,下面,我們僅就SQL執行計劃中最常見的連線方式,做以下簡要介紹和說明。 system : a syst

Spark SQL優化流程(解決叢集OOM問題)

根據七張基礎業務表,生成大寬表 tt_sales_order 1826 7673 大 ord tt_deposit_order 56 0368 小 dep tt_vehicle_action 236 5624 中 vac tt_pipeline_pool 1000 0000

18.Mysql SQL優化

18.SQL優化18.1 優化SQL語句的一般步驟 18.1.1 通過show status命令瞭解各種SQL的執行頻率show [session|global] status; -- 檢視伺服器狀態資訊show session status; -- 檢視session(當前連線)級別的伺服器狀態資訊,預設s

MySQL sql優化的一般步驟

MySQL隨著資料量的增多,遇到SQL執行緩慢的問題越來越多。文中介紹幾種常用的SQL優化的一般步驟. show status explain show profile trace show status show status 主要是檢視各種型別的操作的執行次數。 SHOW

讓天下沒有難用的資料庫 » mysql sql優化之straight_join

在oracle中可以指定的表連線的hint有很多:ordered hint 指示oracle按照from關鍵字後的表順序來進行連線;leading hint 指示查詢優化器使用指定的表作為連線的首表,即驅動表;use_nl hint指示查詢優化器使用nested loops方式連線指定表和其他行源,

讓天下沒有難用的資料庫 » MySql sql優化之order by desc/asc limit M

Order by desc/asc limit M是我在mysql sql優化中經常遇到的一種場景,其優化原理也非常的簡單,就是利用索引的有序性,優化器沿著索引的順序掃描,在掃描到符合條件的M行資料後,停止掃描;看起來非常的簡單,但是我經常看到很多效能較差的sql沒有利用這個優化規律,下面將結合一些

MySQL SQL優化之覆蓋索引

內容概要 利用主索引提升SQL的查詢效率是我們經常使用的一個技巧,但是有些時候MySQL給出的執行計劃卻完全出乎我們的意料,我們預想MySQL會通過索引掃描完成查詢,但是MySQL給出的執行計劃卻是通過全表掃描完成查詢的,其中的某些場景我們可以利用覆蓋索引進行優化。

淺談MySQL SQL優化

本文首發於個人微信公眾號《andyqian》,期待你的關注! 前言 有好幾天沒有寫文章了,實在不好意思。之前就有朋友希望我寫寫MySQL優化的文章。我遲遲沒有動筆,主要是因為,SQL優化這個東西,很廣,技巧也很多。自己在SQL優化方面的知識又還很欠缺。總覺得還不到分享的。

mysql sql優化與索引

寫在前面:索引對查詢的速度有著至關重要的影響,理解索引也是進行資料庫效能調優的起點。考慮如下情況,假設資料庫中一個表有10^6條記錄,DBMS的頁面大小為4K,並存儲100條記錄。如果沒有索引,查詢將對整個表進行掃描,最壞的情況下,如果所有資料頁都不在記憶體,需要讀取10^4個頁面,如果這10^4個頁面在磁

MySQL SQL優化之 執行計劃 explain

1.環境 OS: CentOS 6.5 x64 MySQL: 5.6 for Linux (x86_64) 2.優化第一步 拿到一個慢SQL時,第一步就是看執行計劃並權衡是否可以加索引,就是這麼簡單,不要被高深莫測的人給矇住說什麼有更好的方

Mysql SQL優化方法

1.單庫表別太多,一般保持在200以下為宜. 2.儘量避免SQL中出現運算,例如select a+5 from A,讓DB功能單一化 3.表設計儘量小而精,能用5個欄位就不要用6個(除非業務上使用增加冗餘欄位來提升效能)。 4.SQL事務不能設計太大,比如

MySQL SQL優化:礙手礙腳的索引

該篇是SQL優化的第4篇。這裡主要表達我的一個觀點是:不該存在的索引就該幹掉,留著礙事在2014-3-12 15:39:01 -- 15:55:00這段時間內,在某個業務系統我們發現2個問題:1. 資料

MySQL SQL 優化案例:JOIN派生表

優化之前: SELECT ap.institution_id, date(ra.create_time) date, sum( IF ( ra.confirm_amount > ld.debit_amount, ld.d

(1.10)mysql SQL優化

sort排序 order 排序 http order by nio 所有 mysq files (1.10)常用SQL優化 insert優化、order by 優化 1、insert 優化    2、order by 優化 【2.1】mysql排序方式