在一些系統中有時某張表會出現百萬或者千萬的數據量,儘管其中使用了索引,查詢速度也不必定會很快。這時候可能就須要經過分庫,分表,分區來解決這些性能瓶頸。mysql
1. 分庫分表。sql
分庫分表從名字上就明白是須要建立額外的新數據庫或新表,能夠建在其餘的機器上也能夠是和當前數據庫同一臺機器。在優化查詢上可能須要買新機器或者要修改邏輯代碼了。好比一張user表,當數據超過10W,就能夠建立新的user表,假設是user2。經過接收的UID,和分組10W(假定),取模就是對應的user表名的索引數字。數據庫
2. 分區。服務器
分區這裏是指表分區,mysql數據庫管理系統提供的表功能,分區後邏輯上是同一張表,物理上數據存儲是分開的。可否優化查詢還取決於在查詢中是否使用到了分區字段,這個就和索引的使用有點相似,可是好處就是這個不像分庫分表,能夠幾乎不修改業務邏輯代碼就能夠提高速度。下面再總結一下mysql數據保存格式和innodb,myisam。併發
2.1. innodb存儲引擎。函數
innodb,支持事務處理,外來鍵,在查詢方面要慢於myisam。對併發友好,支持行鎖和表鎖,行鎖的造成要看查詢條件。有共享空間結構和獨立空間結構,保存的格式有frm和ibddata1(共享結構),ibd(獨立結構)。工具
2.1.1.共享空間結構。性能
共享結構爲innodb默認的結構,除了frm保存innodb表結構外,整個數據庫全部表的索引和數據源都保存在ibdata中。能夠經過在mysql-ini中添加 innodb_file_per_table=1設置爲獨立空間結構。優化
2.1.2.獨立空間結構。spa
獨立空間結構就是每一個對應的表保存對應的數據源和索引在一個後綴爲ibd的文件中,表結構一樣也保存在frm中。
2.2. myisam存儲引擎
myisam是mysql默認存儲引擎,不支持事務,可是會對I/O進行平均分配,相較於innodb查詢速度要快,對併發不友好,支持表鎖。格式frm一樣也是表結構,myd爲表的數據源,myi表的索引儲存(因此一張表的索引不是越多越好,由於在添加和修改數據時也須要對索引庫進行修改和添加)
1. RANGE分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
2. LIST分區:相似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。
3. HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數能夠包含MySQL 中有效的、產生非負整數值的任何表達式。
4. KEY分區:相似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
具體介紹能夠搜索如下"mysql表分區的分區類型"。
par格式爲保存的是分區的規則,ibd就是分別爲每一塊分區後的數據源,如下爲innodb分區,myisam的是有多個myd文件同時也存在par。
1. 新建表時添加分區。
好比如下建立一張employees 的表,並建立了list類型的4個分區,以store_id 字段爲分區字段。
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT, store_id INT ) PARTITION BY LIST(store_id) PARTITION pNorth VALUES IN (3,5,6,9,17), PARTITION pEast VALUES IN (1,2,10,11,19,20), PARTITION pWest VALUES IN (4,12,13,14,18), PARTITION pCentral VALUES IN (7,8,15,16) );
2. 存在的表添加分區
將原來的數據以當前的分區規則對原來數據進行規整,如下是對ztest表添加range類型的3個分區,以id字段爲分區字段。
alter table rm_ztest partition by RANGE (id) ( PARTITION p0 VALUES LESS THAN (948), PARTITION p1 VALUES LESS THAN (960), PARTITION p3 VALUES LESS THAN MAXVALUE )
3. navicat for mysql工具添加或建立。
平時我使用上面的工具比較多,因此他也有一個添加分區的功能。"新建表"或者是"設計表",點擊"選項",「分割區」就能夠進入分區的建立了。
我就拿了一張幾百萬數據的表備份了副本,其中一張建立了分區,並使用id分區字段進行查詢。
從上面兩張截圖能夠看出使用了分區的查詢速度要比未使用分區快差很少1倍,可是若是不使用id爲查詢條件或沒有使用到,速度兩者是同樣的,甚至有時分區過的還要慢於未分區的,因此在使用上還需結合當前業務作合理的選擇。
explain partitions select * from table_name …… 能夠查看當前查詢是否使用了分區,分區使用的是哪幾個等等信息。
公衆號