MySQL分区表验证
2020-06-04 05:37
330 查看
MySQL分区表验证
MySQL分区表
针对MySQL 5.6版本以后引入的分区表做些简单验证。
快速验证
创建分区表
'CREATE TABLE `tb_raw_order` ( `order_id` int(11) NOT NULL AUTO_INCREMENT, `buyer_id` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `total_amount` decimal(65,4) DEFAULT NULL, PRIMARY KEY (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci PARTITION BY HASH (order_id) PARTITIONS 4; DROP TABLE IF EXISTS `tb_raw_order_np`; CREATE TABLE `tb_raw_order_np` ( `order_id` int(11) NOT NULL AUTO_INCREMENT, `buyer_id` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `total_amount` decimal(65,4) DEFAULT NULL, PRIMARY KEY (`order_id`) ) ENGINE=InnoDB AUTO_INCREMENT=800001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; show create table tb_raw_order; show table status ;
SQL验证
- 插入数据
INSERT INTO tb_raw_order(buyer_id, total_amount) VALUES('allen', 100.00), ('jack', 2.3434), ('john', 9.99), ('john', 10);
- 查询分区数
select partition_name part, partition_expression expr, partition_description descr, table_rows from information_schema.partitions where table_schema = schema() and table_name='tb_raw_order';
- 查询分区数据
SELECT * FROM testdb2.tb_raw_order ; SELECT * FROM testdb2.tb_raw_order partition(p0); SELECT * FROM testdb2.tb_raw_order partition(p1); SELECT * FROM testdb2.tb_raw_order partition(p2); SELECT * FROM testdb2.tb_raw_order partition(p3);
- 分区执行计划
explain partitions SELECT * FROM testdb2.tb_raw_order ; explain partitions SELECT * FROM testdb2.tb_raw_order partition(p0);
- 更改表分区定义
Alter table testdb2.tb_raw_order partition by hash(order_id)partitions 7; Alter table testdb2.tb_raw_order partition by hash(order_id)partitions 4;
- 创建函数生成随机字符串
DROP FUNCTION IF EXISTS rand_string; CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255) BEGIN DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); SET i = i +1; END WHILE; RETURN return_str; END;
SELECT rand_string(10); SHOW FUNCTION STATUS WHERE DB = 'testdb2';
- 创建存储过程生成测试数据
DROP PROCEDURE IF EXISTS load_tb_raw_orders; CREATE PROCEDURE load_tb_raw_orders ( ) BEGIN DECLARE v INT DEFAULT 0; DECLARE alphabet varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; WHILE v < 800000 DO INSERT INTO tb_raw_order(buyer_id, total_amount) VALUES (concat_ws('_', 'John', rand_string(3)), rand( v ) * 10000); SET v = v + 1; END WHILE; END;
DROP PROCEDURE IF EXISTS load_tb_raw_orders_np; CREATE PROCEDURE load_tb_raw_orders_np ( ) BEGIN DECLARE v INT DEFAULT 0; DECLARE alphabet varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; WHILE v < 800000 DO INSERT INTO tb_raw_order_np(buyer_id, total_amount) VALUES (concat_ws('_', 'John', rand_string(3)), rand( v ) * 10000); SET v = v + 1; END WHILE; END;
- 调用存储过程
TRUNCATE TABLE tb_raw_order; call load_tb_raw_orders(); SELECT * FROM tb_raw_order; SELECT RAND( ), RAND( ), RAND( ); SELECT RAND( 2), RAND( 4), RAND( 6);
TRUNCATE TABLE tb_raw_order_np; CALL load_tb_raw_orders_np(); SELECT * FROM tb_raw_order_np;
SELECT count(*) FROM tb_raw_order_np WHERE mod(order_id, 4) = 0 SELECT count(*) FROM tb_raw_order PARTITION(p0) WHERE mod(order_id, 4) = 0
- 查询性能比较
SHOW processlist SELECT @@profiling SHOW PROFILES; SHOW PROFILE FOR QUERY <query id> SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE query_id = 95; SHOW VARIABLES LIKE '%slow_query_log%'; SET GLOBAL slow_query_log = 1;
高级特性
- 子查询使用Partition
SELECT t1.* FROM tb_raw_order PARTITION(p0) AS t1 , ( SELECT order_id FROM tb_raw_order PARTITION(p0) WHERE buyer_id LIKE 'John_%' ORDER BY order_id DESC LIMIT 2000000, 10 ) AS t2 WHERE t1.order_id = t2.order_id;
EXPLAIN SELECT * FROM tb_raw_order WHERE buyer_id LIKE 'John_%' ORDER BY order_id DESC LIMIT 2000000, 10;
EXPLAIN SELECT t1.* FROM tb_raw_order PARTITION(p0) AS t1 , ( SELECT order_id FROM tb_raw_order PARTITION(p0) WHERE buyer_id LIKE 'John_%' ORDER BY order_id DESC LIMIT 2000000, 10 ) AS t2 WHERE t1.order_id = t2.order_id;
参考资料
相关文章推荐
- 单选按钮与上传文件JavaScript为空验证
- 自定义mvc验证特性,手机号号段老增加,给自定义一个RegularExpress
- java代码验证大数据算法在竞猜足球预测分析中准确率
- Apache HttpClient4.2.5 模拟post、登录并访问验证授权数据
- rman验证备份的可恢复
- Jquery Easyui验证扩展,EasyUI增加校验规则,Easyui验证,Easyui校验
- SpringMVC整合Hibernate Validator验证方法与js校验
- JSClientValidator-客户端javascript验证新模式
- JavaScript验证电话号码
- 【第13周 项目2 - Kruskal算法的验证】
- Spring MVC 使用拦截器优雅地实现权限验证功能
- 关于ASP.NET的“Forms身份验证”
- js加验证,正则表达式
- win2003安装sqlserver 2000提示无法验证产品密钥的解决方法
- Spring Security Oauth2.0 实现短信验证码登录
- REST API的身份验证(Authentication)
- TokuDB的特点验证 - billy鹏
- 【DFS+2-SAT验证】LibreOJ2305(NOI2017)[游戏]题解
- 正则表达式验证E-Mail
- 应用struts的validator验证的一个简单实例