神奇的MySQL分区(一)

2014-11-24 16:59:37 · 作者: · 浏览: 2
神奇的MySQL分区
==先看结果==
有两个结构一样的表,no_part_tab 和 part_tab,一个使用了分区,一个不使用,结果如下。
mysql> select * from no_part_tab where c1 = '80000';
+-------+--------------------+------------+
| c1    | c2                 | c3         |
+-------+--------------------+------------+
| 80000 | testing partitions | 1995-05-25 |
+-------+--------------------+------------+
1 row in set (1.57 sec)


mysql> select * from part_tab where c1 = '80000';
+-------+--------------------+------------+
| c1    | c2                 | c3         |
+-------+--------------------+------------+
| 80000 | testing partitions | 1995-05-25 |
+-------+--------------------+------------+
1 row in set (0.02 sec)


mysql> update part_tab set c2='zhmsong' where c1 = '80000';
Query OK, 1 row affected (0.21 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> update no_part_tab set c2='zhmsong' where c1 = '80000';
Query OK, 1 row affected (15.55 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> delete from no_part_tab where c1 = '80000';
Query OK, 1 row affected (1.46 sec)


mysql> delete from part_tab where c1 = '80000';
Query OK, 1 row affected (0.02 sec)


mysql> select count(*) from no_part_tab;
+----------+
| count(*) |
+----------+
|  7999999 |
+----------+
1 row in set (0.00 sec)


mysql> select count(*) from part_tab;
+----------+
| count(*) |
+----------+
|  7999999 |
+----------+
1 row in set (0.01 sec)


mysql> select count(*) from part_tab where c1 >= '80000' and c1 <= '150000';
+----------+
| count(*) |
+----------+
|    70000 |
+----------+
1 row in set (0.05 sec)


mysql> select count(*) from no_part_tab where c1 >= '80000' and c1 <= '150000';
+----------+
| count(*) |
+----------+
|    70000 |
+----------+
1 row in set (1.89 sec)


mysql>
select count(*) from no_part_tab where c2 like '%test%'; +----------+ | count(*) | +----------+ | 7999999 | +----------+ 1 row in set (1.52 sec) mysql> select count(*) from part_tab where c2 like '%test%'; +----------+ | count(*) | +----------+ | 7999999 | +----------+ 1 row in set (1.59 sec) mysql> select * from no_part_tab where c2 like '%zhmsong%' limit 10 offset 100; +---------+---------+------------+ | c1 | c2 | c3 | +---------+---------+------------+ | 1100100 | zhmsong | 2004-05-13 | | 1100101 | zhmsong | 1999-05-21 | | 1100102 | zhmsong | 2004-05-26 | | 1100103 | zhmsong | 1999-06-03 | | 1100104 | zhmsong | 2004-06-09 | | 1100105 | zhmsong | 1999-06-16 | | 1100106 | zhmsong | 2004-06-22 | | 1100107 | zhmsong | 1999-06-30 | | 1100108 | zhmsong | 2004-07-05 | | 1100109 | zhmsong | 1999-07-13 | +---------+---------+------------+ 10 rows in set (0.22 sec) mysql> select * from part_tab where c2 like '%zhmsong%' limit 10 offset 100; +---------+---------+------------+ | c1 | c2 | c3 | +---------+---------+------------+ | 1100100 | zhmsong | 2004-05-13 | | 1100101 | zhmsong | 1999-05-21 | | 1100102 | zhmsong | 2004-05-26 | | 1100103 | zhmsong | 1999-06-03 | | 1100104 | zhmsong | 2004-06-09 | | 1100105 | zhmsong | 1999-06-16 | | 1100106 | zhmsong | 2004-06-22 | | 1100107 | zhmsong | 1999-06-30 | | 1100108 | zhmsong | 2004-07-05 | | 1100109 | zhmsong | 1999-07-13 | +---------+---------+------------+ 10 rows in set (0.22 sec) == 实现== 01 DROP TABLE IF EXISTS part_tab; 02 CREATE TABLE part_tab ( 03 c1 int default NULL, 04 c2 varchar(30) default NULL, 05 c3 date default NULL 06 ) engine=myisam 07 PARTITION BY RANGE (c1) ( 08 PARTITION p1 VALUES LESS THAN (100000), 09 PARTITION p2 VALUES LESS THAN (200000), 10 PARTITION p3 VALUES LESS THAN (300000), 11 PARTITION p4 VALUES