sql*_*dum 2 mysql mariadb query-performance
我用下面的查询平均每分钟大约 1000 次查询。大多数查询将保持不变,但日期、小时、分钟和 itemName(在本例中为 2021-06-02, 10, 30 和“football”)。我已经切换了各个部分,这似乎是性能的最佳顺序。我怀疑使用不同函数的查询可能更适合性能,但我还没有弄清楚。
SELECT DatetimeRecorded, itemName, field1, field2, field3
FROM StoreData.data
WHERE DatetimeRecorded BETWEEN '2021-06-02' - INTERVAL 30 DAY
AND '2021-06-02' - INTERVAL 1 DAY
AND itemName = 'football'
and HOUR(DatetimeRecorded) = 10
and MINUTE(DatetimeRecorded) <= 30
Run Code Online (Sandbox Code Playgroud)
在示例时间限制下,数据库中“足球”的频率每天只会出现一次,这意味着此查询和其他类似查询将返回最多 30 行,即每天 1 行。
以更易读的格式,我希望更有效地做的是“选择 2021-06-02 之前的 30 天,其中时间在 10:00 到 10:30 之间,项目是足球”
附加信息
这是输出显示创建表
| Data | CREATE TABLE `data` (
`DatetimeRecorded` datetime DEFAULT NULL,
`field1` varchar(255) DEFAULT NULL,
`field2` varchar(255) DEFAULT NULL,
`field3` varchar(9) DEFAULT NULL,
`itemName` varchar(255) NOT NULL,
`field4` varchar(255) DEFAULT NULL,
`field5` double DEFAULT NULL,
`field6` int(11) DEFAULT NULL,
`field7` varchar(255) DEFAULT NULL,
`field8` double DEFAULT NULL,
`field9` int(11) DEFAULT NULL,
`field10` varchar(255) DEFAULT NULL,
`field11` double DEFAULT NULL,
`field12` int(11) DEFAULT NULL,
`field13` varchar(255) DEFAULT NULL,
`field14` double DEFAULT NULL,
`field15` double DEFAULT NULL,
`field16` double DEFAULT NULL,
`field17` double DEFAULT NULL,
`field18` double DEFAULT NULL,
`field19` int(11) NOT NULL,
`field20` mediumtext DEFAULT NULL,
`field21` mediumtext DEFAULT NULL,
`field22` double DEFAULT NULL,
`field23` varchar(255) DEFAULT NULL,
`field24` varchar(255) DEFAULT NULL,
`field25` varchar(255) DEFAULT NULL,
`field26` varchar(255) DEFAULT NULL,
`field27` double DEFAULT NULL,
`field28` int(11) DEFAULT NULL,
`field29` double DEFAULT NULL,
`field30` double DEFAULT NULL,
`field31` double DEFAULT NULL,
`field32` double DEFAULT NULL,
`field33` double DEFAULT NULL,
`field34` datetime DEFAULT NULL,
`field35` varchar(255) DEFAULT NULL,
`field36` double DEFAULT NULL,
`field37` int(11) DEFAULT NULL,
`field38` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
Run Code Online (Sandbox Code Playgroud)
抱歉,如果我遗漏了任何重要的细节,我对 sql 很陌生,希望得到任何指导/建议
添加此索引:
ALTER TABLE StoreData.data ADD INDEX (itemName, DatetimeRecorded);
Run Code Online (Sandbox Code Playgroud)
该itemName列需要先走。这将通过对该列的相等性缩小搜索范围。
然后该DatetimeRecorded列将匹配行内的搜索范围进一步缩小到您想要的日期范围。该指数无助于按小时和分钟缩小范围,因为时间范围每天都在发生;它不是连续的。
如果您想通过索引进一步改进优化,您需要将日期和时间存储在单独的列中。
但是您可能会发现这是不必要的,因为如上所述对前两列进行索引会带来很大的改进,至少在您的表增长几个数量级之前是这样。但无论如何,在每个数量级增长之后,您都应该重新测试您的优化策略。
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |