【发布时间】:2020-12-06 02:17:26
【问题描述】:
我希望为我的日志表实现高效的索引技术,如下所示:
MariaDB [Webapp]> explain logs;
+----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | YES | MUL | NULL | |
| activity_name | varchar(20) | NO | | NULL | |
| activity_key | varchar(255) | NO | | NULL | |
| activity_value | varchar(255) | NO | | NULL | |
| activity_date | datetime | NO | MUL | NULL | |
+----------------+--------------+------+-----+---------+----------------+
我是这样搜索的:
SELECT *
FROM logs
WHERE user_id IN (1, 3)
AND activity_name IN ('login', 'logout')
AND activity_date >= '2020-02-01'
AND activity_date <= '2020-06-01'
涉及列user_id、activity_name 和activity_date
有时像这样:
SELECT *
FROM logs
WHERE user_id IN (1, 3)
AND activity_name IN ('login', 'logout')
user_id 和 activity_name 都涉及但没有日期。
也像这样:
SELECT *
FROM logs
WHERE user_id IN (1, 3)
AND activity_date >= '2020-02-01'
AND activity_date <= '2020-06-01'
SELECT *
FROM logs
WHERE activity_name IN ('login', 'logout')
AND activity_date >= '2020-02-01'
AND activity_date <= '2020-06-01'
我确实读过复合索引,如果我的搜索是有序的,它们会很好,但正如你所见,它不是,所以我认为它不合适..
我还读到 single index 一次只能用于一列,所以我认为这对我的情况不利..
请有任何想法,我对 MySQL 不太熟悉。如何优化查询?
注意:我不使用通配符 (*),因为我阅读它会减慢速度,但我只是为了缩短查询以便于理解而使用它 p>
【问题讨论】:
标签: mysql indexing mariadb query-optimization where-clause