一、把某些判斷移動到應用層
我們需要在一張表裡面刪除某種型別的資料,大概的表結構類似這樣:
createtable
t ( id
int,
tp enum ("t1", "t2"),
primary
key(id)
) engine
=innodb;
假設我們需要刪除型別為t2的資料,語句可能是這樣delete from t where tp = "t2"
,這樣沒啥問題,但我們這張表有5億資料
delete from t where tp = "t2" limit 1000
,
使用limit來限制一次刪除的個數,,不過這有個很嚴重的問題,就是越往後,隨著t2型別的減少,我們幾乎都是全表遍歷來刪除,所以總的應該是o(n*n)的開銷。
於是我讓他考慮主鍵,每次操作的時候,記錄當前最大的主鍵,這樣下次就可以從這個主鍵之後開始刪除了,首先
select id from t where id > last_max_select_id and tp = "t2" limit 1000;
delete from t where id in (ids);
雖然我們使用了主鍵,但是mysql仍然需要不停的讀取資料判斷條件,加之t2型別的資料在表裡面比較少量,所以為了limit 1000這個條件,mysql需要持續的進行io讀取操作,結果自然是太慢了。
想清楚了這個,其實就好優化了,我們只需要讓條件判斷在應用層做,mysql只查詢資料返回,語句就是
select id, tp from t where id > last_max_select_id limit 1000;
得到結果集之後,自行判斷需要刪除的id,然後delete。
看似我們需要額外處理邏輯,並且網路開銷也增大了,但mysql只是簡單的io讀取,效能改善明顯。
二、three start index
索引設計的原則
1. 查詢謂詞都能夠通過index進行掃瞄
2. 排序謂詞都能夠利用index的有序性
3. index包含了查詢所需要的所有字段
查詢優化(MySQL優化查詢)
關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...
mysql統計查詢優化 Mysql查詢優化
效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...
MySQL優化 查詢優化
在每乙個消耗大量時間的查詢中,都能看到一些不必要的額外操作 某些操作被額外地重複了很多次 某些操作執行得太慢等。優化查詢的目的就是減少和消除這些操作所花費的時間。查詢效能低下最基本的原因是訪問的資料太多。所以需要考慮是否向資料庫請求了不需要的資料 1 多表關聯時,或獲取單錶資料時,盡量避免不加思考地...