您的位置:首页 > 数据库 > MySQL

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验证

    1. 插入数据
    INSERT INTO tb_raw_order(buyer_id, total_amount) VALUES('allen', 100.00), ('jack', 2.3434), ('john', 9.99), ('john', 10);
    1. 查询分区数
    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';
    1. 查询分区数据
    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);
    1. 分区执行计划
    explain partitions SELECT * FROM testdb2.tb_raw_order ;
    explain partitions SELECT * FROM testdb2.tb_raw_order partition(p0);
    1. 更改表分区定义
    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;
    1. 创建函数生成随机字符串
    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';
    1. 创建存储过程生成测试数据
    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;
    1. 调用存储过程
    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
    1. 查询性能比较
    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;

    高级特性

    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;

    参考资料

    1. MySQL存储过程
    2. MySQL表分区
    3. M有SQL性能工具简介
    4. MySQL官方的分区资料
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: