mysql - 如何优化表中的索引列?

标签 mysql database mariadb

我正在尝试向我的 MySQL 数据库添加索引,因为系统使用的统计数据库查询速度太慢。

超过50000个元组的1分钟统计需要大约30分钟

起初,我尝试为每列添加一个索引,但这会导致数据库性能下降。因为查询使用了多列,所以我应该使用实际使用的索引。

我使用的实际查询如下简单版本。 条件可能会改变,

SELECT TIME,A,B,C,D,E,F,G FROM STAT_TBL1 WHERE TIME >='2019-07-04 16:00:00' AND TIME <='2019-07-04 16:59:59' AND H IN ('blah1') AND I IN ('blah2') ORDER BY TIME
SELECT TIME,A,B,C,D,E,F,G FROM STAT_TBL2 WHERE TIME >='2019-07-04 16:00:00' AND TIME <='2019-07-04 16:59:59' AND J IN ('blah3') AND K IN ('blah4') ORDER BY TIME
SELECT TIME,A,B,C,D,E,F,G FROM STAT_TBL3 WHERE TIME >='2019-07-04 16:00:00' AND TIME <='2019-07-04 16:59:59' AND H IN ('blah1') AND I IN ('blah2') AND J IN ('blah3') AND K IN ('blah4') ORDER BY TIME

我尝试创建以下索引:

CREATE INDEX IDX_LIST1_01 ON STAT_TBL1 (TIME)
CREATE INDEX IDX_LIST1_02 ON STAT_TBL1 (H)
CREATE INDEX IDX_LIST1_03 ON STAT_TBL1 (I)

CREATE INDEX IDX_LIST2_01 ON STAT_TBL3 (TIME)
CREATE INDEX IDX_LIST2_02 ON STAT_TBL3 (J)
CREATE INDEX IDX_LIST2_03 ON STAT_TBL3 (K)

CREATE INDEX IDX_LIST3_01 ON STAT_TBL3 (TIME)
CREATE INDEX IDX_LIST3_02 ON STAT_TBL3 (H)
CREATE INDEX IDX_LIST3_03 ON STAT_TBL3 (I)

哪个更好;添加每列索引还是多列索引?

最佳答案

具有多列的索引通常会更快。将日期用于多列索引以及通常用于过滤数据的一两个其他列。如果您使用许多不同的列来过滤数据,这些列因查询而异,则必须创建那么多索引。

关于mysql - 如何优化表中的索引列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56884006/

相关文章:

MySQL合并来自具有相同名称的列的数据

mysql - 使用 GROUP BY 计算 COUNT 的百分比

java - 使用 Hibernate 进行分层数据版本控制的好的数据库设计是什么?

java - 数据库值分离

sql - 如何在Django中每天为数据库创建新表

php - 如何改进我的地理位置查询以免占用 8 分钟的 CPU 时间

MySQL - 查找第一个匹配项或通配符

mysql - 如果没有结果,如何使查询返回 0 而不是空集

mysql - 如果类别为空,SQL删除类别

mysql - AES_Decrypt() 返回空值