資料庫:mysql
資料量:3千萬
字段個數:12個字段
大字段:最大bigint
主鍵索引和field5索引
1.主鍵id雪花生成器生成,插入資料的時候到達1200萬左右,就異常的緩慢,每秒插入低於100個,無法接受。
2.查詢的時候,explain select field1, field2, field3, field4 from tablename where field5= 46100151664131 limit 0,200
查詢100條資料接近0.5秒,批量查詢10個接近5秒,難以接受
1.為什麼插入開始十分的快,後面就慢下來了,原因是什麼?
懂得mysql快取結構的人應該清楚,插入沒提交實在記憶體中儲存的,另外主鍵索引是聚簇索引,b+樹葉子節點會儲存資料本身,那麼隨著插入量大於一千多萬的時候,記憶體中的頁不能儲存所有資料頁了,而採用lru原則保留部分分頁資料,insert語句比較大,主鍵id分布的索引頁比較廣泛,那麼記憶體就需要頻繁的和硬碟交換資料,載入資料頁,導致變慢。
解決辦法:知道b+樹原理就可以知道,主鍵id遞增分頁,那麼如果我主鍵id遞增,快取頁利用率就會起來,不會頻繁載入硬碟資料。
2.為什麼field5欄位也是索引,插入為什麼不影響速度?
因為field5是非聚簇索引,b+樹的葉子節點只保留主鍵id,id比較小,可以在記憶體中操作。所以不需要跟硬碟打交道。
1.根據截圖的explain可知,利用上了索引,而且是const,為什麼還慢?
表大了,會遇到explain也不能解決的問題,那還就是快取的問題。根據field5獲取到主鍵id列表肯定快,然後主鍵id載入資料理論上也快,但是如果從硬碟上載入,速度也會有所限制。但是因為lru原理,只要第二次訪問就會很快,那麼新增重試,速度即可大大提高。
mysql的explain能夠對常規的語句優化建議,對於大表而言,還需要考慮儲存結構和快取原理。
MySQL 對於千萬級的大表的優化?
第一 優化你的sql和索引 第二 加快取,memcached,redis 第三 以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四 如果以上都做了還是慢,不要想著去做切分,mysq...
千萬級的大表!MySQL這樣優化更好
對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...
千萬級的大表!MySQL這樣優化更好
對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...