执行以下查询,发现执行时间特别长。表A是一个小表,里面就几千条记录,B是一个大表,里面有几千万条记录。两个表mobile上都有唯一索引。
SELECT date(A.add_time) AS day, count(*) FROM A JOIN B on A.mobile = B.mobile GROUP BY day;
按照MySQL的执行计划来说,应该把表A作为外表,表B作为内表来连接,这样只要做几千次的索引查询,便可以得出结果。
表定义如下:
CREATE TABLE `A` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`mobile` varchar(45) DEFAULT NULL,
`add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `mobile` (`mobile`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `B` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`mobile` varchar(45) DEFAULT NULL,
`register_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_mobile` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
系统的编码设置如下:
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | utf8mb4 |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
分析
先使用EXPLAIN查看
版权声明:本文为ma_ru_long原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。