国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

大幅提升MySQL中InnoDB的全表掃描速度的方法

2024-07-24 12:45:54
字體:
來源:轉載
供稿:網友

 在 InnoDB中更加快速的全表掃描
 一般來講,大多數應用查詢的時候都會用索引,查找很少的幾行數據(主鍵查找或百行內的查詢),但有時候我們需要全表查詢。典型的全表掃描就是邏輯備份  (mysqldump) 和 online schema changes( 注:在線上對大表 schema 的操作,也是 facebook 的一個開源項目) (SELECT ... INTO OUTFILE).

 在 Facebook我們用 mysqldump 來備份數據庫. 正如你所知MySql提供兩種備份方式,提供了物理備份和邏輯備份的命令和工具. 相對物理備份,邏輯備份有一定的優勢,例如:

    邏輯備份備份數據要小得多. 3x-10x 尺寸差異并不少見。     更容易解析備份數據庫. 在物理備份中,在出現嚴重問題時候,如校驗失敗。如果我們不能將數據庫恢復 ,想知道InnoDB內部數據結構,或者修復損壞是十分困難的。比起物理備份我們更加相邏輯備份。

邏輯備份的主要缺點是數據庫的完全備份和完全還原比物理的備份恢復慢得多。

緩慢的完全邏輯備份往往會導致問題.如果數據庫中存在很多大小支離破碎的表,它可能需要很長的時間。在 臉書,我們面臨 mysqldump 的性能問題,導致我們不能在合理的時間內對一些(基于HDD和Flashcache的)服務器完成完整邏輯備份。我們知道 InnoDB做全表掃描并不高效,因為 InnoDB 實際上并沒有順序讀取,在大多情況下是在隨機讀取。這是一個已知多年的老問題了。我們的數據庫存儲容量一直在增長,緩慢的全表掃描問題給我們造成了嚴重的影響,因此,我們決定加強 InnoDB 做順序讀取的速度。最后我們的數據庫攻堅工程師團隊在InnoDB 中實現了"Logical Readahead"功能。應用"Logical readahead",在通常生產工作負載下,我們全表掃描速比之從前度提高 9 ~ 10 倍。在超負荷生產中,全表掃描速度達到 15 ~ 20 倍的速度甚至更快。

全表掃描在大的、碎片化數據表上的問題
做全表掃描時,InnoDB 會按主鍵順序掃描頁面和行。這應用于所有的InnoDB 表,包括碎片化的表。如果主鍵頁表沒有碎片(存儲主鍵和行的頁表),全表掃描是相當快,因為讀取順序接近物理存儲順序。這是類似于讀取文件的操作系統命令(dd/cat/etc) 像下面。
 

復制代碼 代碼如下:
dd if=/data/mysql/dbname/large_table.ibd of=/dev/null bs=16k iflag=direct

你可能會發現即使在商業HDD服務器上,你可以達到高于比100 MB/s 乘以"驅動器數目"的速度。超過1GB/s并不少見。

不幸的是,在許多情況下主要關鍵頁表存在碎片。例如,如果您需要管理 user_id 和 object_id 映射,主鍵將會是(user_id,object_id)。插入排序與 user_id并不一致,那么新插入/更新往往導致頁拆分。新的拆分頁將被分配在遠離當前頁的位置。這意味著頁面將會碎片化。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁明县| 玉门市| 湖北省| 名山县| 扎赉特旗| 九龙城区| 石首市| 临夏县| 蚌埠市| 安康市| 全南县| 洱源县| 南宫市| 双江| 特克斯县| 额尔古纳市| 徐水县| 武山县| 卫辉市| 兴城市| 泾阳县| 玛纳斯县| 青河县| 万山特区| 南昌市| 平塘县| 澎湖县| 上杭县| 砚山县| 石林| 霍林郭勒市| 秭归县| 丽水市| 邓州市| 麻江县| 宣汉县| 丽水市| 郁南县| 尼勒克县| 耿马| 萍乡市|