MySQL的List分割槽表
MySQL分割槽表簡介
http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-list
今天有一個需求,稽核圖片是否違規,
需要查詢尚未稽核的圖片.
其中status 1表示尚未稽核;0表示已經稽核;-1表示未透過稽核
初始化實驗資料:
實驗假設表中有1kw記錄,尚未透過稽核的資料佔全部資料的十分之一左右.
現在需要查詢這些尚未透過稽核的資料資訊。
這種需求還是很常見的.
如果是Oracle資料庫,可以使用函式索引解決這個問題
http://blog.itpub.net/29254281/viewspace-775791/
但是很明顯,MySQL沒有這個功能.
由於結果集很大,MySQL會傾向於全表掃描這個表.效率很低.
這種情況下,即使status欄位建立索引也沒有任何效果,反而降低效能.
這個時候,可以考慮使用List分割槽表處理.
但是status要作為主鍵的一部分,這樣只能是聯合主鍵,對於使用Hibernate的專案,這個改動還是很煩人的.
(分割槽的欄位必須是主鍵的一部分)
使用List分割槽表之後,該場景的效能大幅提升
主要是應用了分割槽消除,從原來的全表掃描,變成了全分割槽掃描.
這樣掃描的資料從689M降為了57M
http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html#partitioning-list
今天有一個需求,稽核圖片是否違規,
需要查詢尚未稽核的圖片.
其中status 1表示尚未稽核;0表示已經稽核;-1表示未透過稽核
初始化實驗資料:
-
drop table if exists t;
-
create table t(
-
id int auto_increment primary key,
-
pictureURL varchar(10),
-
status int,
-
createtime datetime
-
);
-
-
drop procedure if exists initData;
-
-
delimiter $$
-
create procedure initData()
-
begin
-
set @index=0;
-
while @index<10000000 do
-
insert into t(createtime) values(now()-interval @index second);
-
set @index:=@index+1;
-
end while;
-
commit;
-
end$$
-
delimiter ;
-
-
call initData();
-
update t set status=0;
-
update t set status=1 where mod(id,9)=0;
- commit;
現在需要查詢這些尚未透過稽核的資料資訊。
這種需求還是很常見的.
如果是Oracle資料庫,可以使用函式索引解決這個問題
http://blog.itpub.net/29254281/viewspace-775791/
但是很明顯,MySQL沒有這個功能.
由於結果集很大,MySQL會傾向於全表掃描這個表.效率很低.
這種情況下,即使status欄位建立索引也沒有任何效果,反而降低效能.
這個時候,可以考慮使用List分割槽表處理.
但是status要作為主鍵的一部分,這樣只能是聯合主鍵,對於使用Hibernate的專案,這個改動還是很煩人的.
(分割槽的欄位必須是主鍵的一部分)
-
drop table if exists t1;
-
create table t1(
-
id int auto_increment,
-
pictureURL varchar(10),
-
status int,
-
createtime datetime,
-
primary key(id,status)
-
)
-
partition by list(status)
-
(
-
partition s0 values in (0),
-
partition s1 values in (1),
-
partition s2 values in (2),
-
partition other values in (null)
-
);
-
-
insert into t1 select * from t;
- commit;
主要是應用了分割槽消除,從原來的全表掃描,變成了全分割槽掃描.
這樣掃描的資料從689M降為了57M
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1281084/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL LIST分割槽MySql
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- 【MYSQL】 分割槽表MySql
- MySQL 分割槽表MySql
- MySQL分割槽表MySql
- MySQL 分割槽表探索MySql
- mysql 分表 分割槽MySql
- mysql 分割槽表用法MySql
- MySQL表分割槽管理MySql
- MySQL分割槽表的分割槽原理和優缺點MySql
- 全面學習分割槽表及分割槽索引(6)--建立range-list組合分割槽索引
- mysql的分割槽和分表MySql
- mysql的分割槽與分表MySql
- MySQL 分割槽表 partition線上修改分割槽欄位MySql
- mysql 進行表分割槽MySql
- Mysql表分割槽實現MySql
- mysql分割槽表筆記MySql筆記
- MySQL入門--分割槽表MySql
- mysql —— 分表分割槽(1)MySql
- Mysql表分割槽實操MySql
- 將mysql非分割槽錶轉換為分割槽表MySql
- mysql~關於mysql分割槽表的測試MySql
- Oracle分割槽表基礎運維-07增加分割槽(5RANGE_LIST)Oracle運維
- MySQL 分割槽表知識整理MySql
- MySQL調優之分割槽表MySql
- mysql分割槽表小結2MySql
- mysql表水平拆分和分割槽分表MySql
- MySQL表的四種分割槽型別MySql型別
- 如何查詢分割槽表的分割槽及子分割槽
- oracle分割槽表和分割槽表exchangeOracle
- rebuild分割槽表分割槽索引的方法Rebuild索引
- MySQL資料表分割槽手記MySql
- (3) MySQL分割槽表使用方法MySql
- mysql之分割槽表小結1MySql
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- oracle分割槽表和非分割槽表exchangeOracle
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引