【发布时间】:2021-11-18 10:51:50
【问题描述】:
我有问题。我有一张表,里面有 600 万条记录。每条记录都有一个日期时间列,对于我的代码,我需要按升序排列的最新 16 条记录。直接从原始表中查询花费的时间太长,因此我使用以下查询创建了一个视图:
SELECT openTime, high, low, a, b, c, d, e FROM Candlestick WHERE market = 'USDT' AND coin = 'ETH' AND period = '5m' ORDER BY openTime DESC LIMIT 16
这意味着视图只包含 16 条记录。然后在我的代码中,我使用带有以下查询的视图:
SELECT high, low, a, b, c, d, e FROM vwCI_USDT_ETH_5m ORDER BY openTime ASC
此查询获取所有(16 条记录)记录并将其按升序排列,但即使对于这 16 行,查询也需要大约 25 秒,如下图所示: 有没有办法加快这个选择查询?
更新
我在 Candlestick 表上创建了一个索引,就像 @The Impaler 告诉我的那样,我现在正在使用以下没有视图的查询:
SELECT a.high, a.low, a.a, a.b, a.c, a.d, a.e FROM (SELECT openTime, high, low, a, b, c, d, e FROM Candlestick WHERE market = 'USDT' AND coin = 'ETH' AND period = '5m' ORDER BY openTime DESC LIMIT 16 ) AS a ORDER BY a.openTime ASC
这是我现在所有的索引: 但仍然在索引之后,此查询大约需要 20 - 25 秒。我可以做些什么来改进它?
show create table Candlestick;的结果:
CREATE TABLE `Candlestick` (
`dateTimeChanged` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`openTime` bigint(20) NOT NULL,
`closeTime` bigint(20) NOT NULL,
`market` varchar(10) NOT NULL,
`coin` varchar(10) NOT NULL,
`period` varchar(10) NOT NULL,
`open` decimal(14,6) NOT NULL DEFAULT 0.000000,
`high` decimal(14,6) NOT NULL DEFAULT 0.000000,
`low` decimal(14,6) NOT NULL DEFAULT 0.000000,
`close` decimal(14,6) NOT NULL DEFAULT 0.000000,
`volume` decimal(20,8) NOT NULL DEFAULT 0.00000000,
`a` decimal(6,3) NOT NULL DEFAULT 0.000,
`b` decimal(3,0) NOT NULL DEFAULT 0,
`c` decimal(3,0) NOT NULL DEFAULT 0,
`d` decimal(3,0) NOT NULL DEFAULT 0,
`e` varchar(1) NOT NULL DEFAULT '0',
`ma5` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema5` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema10` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema12` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema20` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema26` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema50` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema55` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema100` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`ema200` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`rsi14AvgGain` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`rsi14AvgLoss` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`rsi14` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`macd` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`signal` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`bbLower` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`bbMiddle` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`bbUpper` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`dmiDIPositive` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`dmiDINegative` decimal(16,8) NOT NULL DEFAULT 0.00000000,
`dmiADX` decimal(16,8) NOT NULL DEFAULT 0.00000000,
PRIMARY KEY (`openTime`,`market`,`coin`,`period`) USING BTREE,
KEY `OpenTime` (`openTime`) USING BTREE,
KEY `MarketCoinPeriod` (`market`,`coin`,`period`) USING BTREE,
KEY `ix1` (`market`,`coin`,`period`,`openTime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
【问题讨论】:
-
显示以下结果:
SELECT version();和show create table Candlestick; -
Version:
10.3.31-MariaDB-0ubuntu0.20.04.1-logshow create table Candlestick:CREATE TABLE Candlestick (dateTimeChanged t...这是我唯一能看到的,但创建查询有2157字符,因为我有 37 列! -
啊。所以它不是 MySQL。使用MySQL命令行客户端获取完整结果:
show create table Candlestick; -
啊,我会在问题的底部添加它!
-
openTime列的正确顺序的覆盖索引似乎确实有帮助。请参阅提供的小提琴。它包含我创建的表,以及您提供详细信息后的实际表。如果openTime的顺序不是您需要的顺序,通常不会选择索引。 MariaDB 支持降序索引来解决这种情况。 对不起。它允许语法。我看到了一些相互矛盾的文档。 我没有明确的细节。但该计划似乎表明它有所帮助。
标签: sql mariadb query-optimization mariadb-10.3