版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/konkon2012/article/details/96482548
爲了加快查詢,咱們一般根據Where條件建立索引!那麼分區後再建立索引,那就應該更快了!.net
咱們依據訂單表和訂單商品表舉例,先建立表結構:blog
CREATE TABLE `zstb_orders` ( `order_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `org_id` INT(10) UNSIGNED NOT NULL, `order_money` DECIMAL(6,2) UNSIGNED NOT NULL DEFAULT '0.00', PRIMARY KEY (`order_id`,`org_id`), KEY `order_id` (`order_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE `zstb_orders_goods` ( `order_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', `org_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', `goods_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', `goods_name` VARCHAR(20) DEFAULT '', PRIMARY KEY (`order_id`,`org_id`,`goods_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
咱們經過`org_id`來對兩張表進行分區,腳本以下:索引
ALTER TABLE `zstb_orders` PARTITION BY RANGE(`org_id`) ( PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200), PARTITION p3 VALUES LESS THAN (300), PARTITION p4 VALUES LESS THAN (400), PARTITION p5 VALUES LESS THAN MAXVALUE ); ALTER TABLE `zstb_orders_goods` PARTITION BY RANGE(`org_id`) ( PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200), PARTITION p3 VALUES LESS THAN (300), PARTITION p4 VALUES LESS THAN (400), PARTITION p5 VALUES LESS THAN MAXVALUE );
至於爲何要使用'org_id'來進行分區,不是本文要討論的問題,你能夠根據你自身的需求使用其餘字段來進行分區。class
而後插入幾條數據:bfc
INSERT INTO `zstb_orders`(`order_id`, `org_id`, order_money) VALUES (1, 50, 200); INSERT INTO `zstb_orders_goods`(`order_id`,`org_id`,`goods_id`,`goods_name`) VALUES (1, 50, 1, '酸奶'); INSERT INTO `zstb_orders_goods`(`order_id`,`org_id`,`goods_id`,`goods_name`) VALUES (1, 50, 2, '純奶'); INSERT INTO `zstb_orders`(`order_id`, `org_id`, order_money) VALUES (2, 150, 200); INSERT INTO `zstb_orders_goods`(`order_id`,`org_id`,`goods_id`,`goods_name`) VALUES (2, 150, 1, '酸奶'); INSERT INTO `zstb_orders_goods`(`order_id`,`org_id`,`goods_id`,`goods_name`) VALUES (2, 150, 2, '純奶'); INSERT INTO `zstb_orders`(`order_id`, `org_id`, order_money) VALUES (3, 350, 200); INSERT INTO `zstb_orders_goods`(`order_id`,`org_id`,`goods_id`,`goods_name`) VALUES (3, 350, 1, '酸奶'); INSERT INTO `zstb_orders_goods`(`order_id`,`org_id`,`goods_id`,`goods_name`) VALUES (3, 350, 2, '純奶');
接下來咱們來進行查詢分析:程序
EXPLAIN PARTITIONS SELECT * FROM `zstb_orders` WHERE org_id = 150;
咱們對訂單表進行查詢的時候,發現雖然僅僅掃描‘p2’分區,可是沒有使用到主鍵索引,有點遺憾。im
一樣,咱們也對訂單商品表進行查詢分析:d3
EXPLAIN PARTITIONS SELECT * FROM `zstb_orders_goods` WHERE org_id = 150;
結果仍是隻掃描'p2'分區,並無使用到主鍵索引。數據
咱們再分析連表查詢試試:協議
EXPLAIN PARTITIONS SELECT * FROM `zstb_orders` AS o JOIN `zstb_orders_goods` AS g ON o.order_id = g.order_id WHERE o.org_id = 150;
對主表‘zstb_orders’的查詢雖然只掃描‘p2’分區,可是沒有使用主鍵索引。
對連表‘zstb_orders_goods’的查詢是掃描全表,可是使用了主鍵索引,爲何沒有掃描具體的分區表呢?
EXPLAIN PARTITIONS SELECT * FROM `zstb_orders` AS o JOIN `zstb_orders_goods` AS g ON o.order_id = g.order_id AND o.org_id = g.org_id WHERE o.org_id = 150;
考慮‘zstb_orders_goods’是經過'org_id'進行分區的,可是連表查詢的時候,沒有指明對'org_id',咱們只須要在關聯查詢條件
上面增長‘org_id’的關聯便可,分析以下:
主表查詢沒有變化,連表‘zstb_orders_goods’的查詢雖然找到了分區表'p2',可是索引又丟失了!
因此,若是咱們須要創建分區的同時,還要使用索引的話,得從新建立了。
ALTER TABLE `zstb_orders_goods` ADD INDEX org_id_index(`org_id`);
建立完以後,咱們先看看單表查詢狀況:
EXPLAIN PARTITIONS SELECT * FROM `zstb_orders_goods` WHERE org_id = 150;
剛纔雖然掃描了'p2'分區,可是沒有使用索引,此次咱們建立索引後,它就用上了,OK!
在分析剛纔的連表查詢語句:
EXPLAIN PARTITIONS SELECT * FROM `zstb_orders` AS o JOIN `zstb_orders_goods` AS g ON o.order_id = g.order_id AND o.org_id = g.org_id WHERE o.org_id = 150;
即掃描了分區表,又使用到了索引!
固然,若是但願主表'zstb_orders'查詢的時候也使用索引的話,那麼咱們也須要對'zstb_orders'建立'org_id'索引便可。————————————————版權聲明:本文爲CSDN博主「咆哮的程序猿」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/konkon2012/article/details/96482548