【发布时间】:2020-12-02 18:52:44
【问题描述】:
我有以下需要大量时间的 sql 命令。我正在考虑索引
SELECT `daily_price_history`.`high`,
`daily_price_history`.`low`,
`daily_price_history`.`open`,
`daily_price_history`.`datetime`,
`daily_price_history`.`close`,
`daily_price_history`.`creation_time`
FROM `daily_price_history`
WHERE (`daily_price_history`.`datetime_utc` BETWEEN '2015-12-04 18:43:28.710229' AND '2020-12-02 18:43:28.710229'
AND `daily_price_history`.`symbol` = 'A')
ORDER BY `daily_price_history`.`creation_time` ASC
所以索引多个列(datetime_utc,symbol) 是最好的方法或索引两个单独的列。
我的SHOW CREATE TABLE
CREATE TABLE `daily_price_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`symbol` varchar(50) NOT NULL,
`symbolExpectionCount` int(11) NOT NULL,
`url` longtext NOT NULL,
`volume` double NOT NULL,
`high` double NOT NULL,
`low` double NOT NULL,
`open` double NOT NULL,
`datetime` bigint(20) NOT NULL,
`datetime_utc` datetime(6) NOT NULL,
`close` double NOT NULL,
`creation_time` datetime(6) NOT NULL,
`lot_time` datetime(6) NOT NULL,
`periodType` varchar(50) NOT NULL,
`symbolId_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `daily_price_history_symbolId_id_30077f62_fk_symbol_list_id` (`symbolId_id`),
KEY `datetime` (`datetime`),
CONSTRAINT `daily_price_history_symbolId_id_30077f62_fk_symbol_list_id` FOREIGN KEY (`symbolId_id`) REFERENCES `symbol_list` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11549349 DEFAULT CHARSET=utf8mb4
我有一个名为symbol_list 的表,所以这里symbol 只是符号文本,而symbolId_id 是与symbol_list 的外键关系
【问题讨论】:
-
我只是索引日期时间并尝试一下。索引的类型应该是 btree 或允许选择范围的任何其他类型的索引。
-
符号呢
-
在我看来,包含符号不会得到太多好处:一旦选择了日期时间范围内的行,就可以在内存中快速完成进一步的过滤。您可以尝试这两种选择。
-
@Tarik - 这个场景是一个很好的例子,说明
INDEX(symbol, dt)的性能将显着优于INDEX(dt)或INDEX(symbol)或INDEX(dt, symbol)。
标签: mysql indexing query-optimization