【发布时间】:2021-11-22 12:18:38
【问题描述】:
我有一个包含 1.09 亿条记录的表(每天都在增长)——现在大约 20GB。 这是一个从许多带有时间戳的变量中收集数据的表。这是一个scada系统。 很简单,
CREATE TABLE `INVIEW_LOGS` (
`id` bigint(20) NOT NULL,
`iws_conn_id` smallint(6) NOT NULL,
`prf_station_id` smallint(3) NOT NULL,
`iws_var_id` mediumint(9) NOT NULL,
`var_name` char(125) NOT NULL,
`dia_hora` datetime NOT NULL,
`valor` decimal(18,2) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `INVIEW_LOGS`
--
ALTER TABLE `INVIEW_LOGS`
ADD PRIMARY KEY (`id`),
ADD KEY `prf_station_id` (`prf_station_id`),
ADD KEY `var_name` (`var_name`),
ADD KEY `var_name_2` (`var_name`),
ADD KEY `var_name_3` (`var_name`),
ADD KEY `var_name_4` (`var_name`),
ADD KEY `var_name_5` (`var_name`);
我必须制作图形,并且必须检索 6 或 7 个变量的最后 10000 条记录来绘制图表。
问题是......即使有索引和优化,一些变量(有超过 10000 条记录,我有百万条记录的变量),检索该变量的时间很长.. 大约 28 秒。
我该如何调整这个?!
我将它从 INODDB 更改为 MyISAM - 这是第二个数据库,用于读取一整天并在夜间的短时间内写入每日记录。
已编辑 - 2021 年 10 月 1 日
-- Estrutura da tabela `INVIEW_LOGS`
--
CREATE TABLE `INVIEW_LOGS` (
`id` bigint(20) NOT NULL,
`iws_conn_id` smallint(6) NOT NULL,
`prf_station_id` smallint(3) NOT NULL,
`iws_var_id` mediumint(9) NOT NULL,
`var_name` char(125) NOT NULL,
`dia_hora` datetime NOT NULL,
`valor` decimal(18,2) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `INVIEW_LOGS`
--
ALTER TABLE `INVIEW_LOGS`
ADD PRIMARY KEY (`id`),
ADD KEY `prf_station_id` (`prf_station_id`),
ADD KEY `var_name` (`var_name`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `INVIEW_LOGS`
--
ALTER TABLE `INVIEW_LOGS`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
我不知道为什么 var_name 上有这么多索引 我重建了它。
查询
select dia_hora, valor FROM INVIEW_LOGS WHERE var_name='PRF.Posto.var_5.VALUE' ORDER BY id DESC LIMIT 10000 10000 行(29.09 秒)
带有和索引 选择 dia_hora, valor FROM INVIEW_LOGS WHERE prf_station_id=12 AND var_name='PRF.Posto.var_5.VALUE' ORDER BY id DESC LIMIT 10000 10000 行(21.13 秒)
【问题讨论】:
-
尝试使用分区
-
为什么同一列有五个相同的索引?
-
当您询问有关查询优化的问题时,您应该显示查询本身。某些查询将无法使用您的索引。还为您尝试改进的查询运行
EXPLAIN SELECT ...,以显示当前优化器估计它将如何使用索引(或不使用索引)。
标签: mysql performance indexing