【发布时间】:2021-09-12 13:05:00
【问题描述】:
我在 Innodb 中有一个超过 2000 万行的表。
列是
id, viewable_id, visitor, viewed_at
viewable_id 和 viewed_at 是索引。
当我进行以下查询时
SELECT COUNT(*)
FROM views_users
WHERE (viewable_id = 2)
and (viewed_at between '2021-04-19 01:38:37'
and '2021-06-30 01:38:37');
=> 耗时(3 分 6.72 秒)
解释是
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+-----------------------------------------------------------+-------------------------------+---------+-------+---------+----------+-------------+
| 1 | SIMPLE | views_users | NULL | ref | views_users_viewable_id_index,views_users_viewed_at_index | views_users_viewable_id_index | 8 | const | 9554594 | 50.00 | Using where
如何将性能提高到 4 秒以下?
CREATE TABLE views_users (
id int unsigned NOT NULL AUTO_INCREMENT,
viewable_type varchar(255) NOT NULL,
viewable_id bigint unsigned NOT NULL,
visitor text,
collection varchar(255) DEFAULT NULL,
viewed_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_id (viewable_id)
) ENGINE=InnoDB AUTO_INCREMENT=20995848
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
【问题讨论】:
-
请提供
SHOW CREATE TABLE views_users。 -
@RickJames views_users |创建表
views_users(idint unsigned NOT NULL AUTO_INCREMENT,viewable_typevarchar(255) NOT NULL,viewable_idbigint unsigned NOT NULL,visitortext,collectionvarchar(255) DEFAULT NULL, @98 @timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEYuser_id(viewable_id) ENGINE=InnoDB AUTO_INCREMENT=20995848 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci -
COUNT(*)返回什么?innodb_buffer_pool_size的值是多少?你有多少内存?
标签: mysql sql count query-optimization database-performance