慢速查询(未索引)大表

时间:2016-11-07 09:08:41

标签: mysql performance

我有这个表plc_data:

SELECT `T1`.`nome`, `T1`.`valore`, `T1`.`data_ora` 
  FROM `plc_data` `T1` 
  WHERE data_ora = (select max(T2.data_ora) 
                      from plc_data T2 
                      where T1.nome = `T2`.`nome`)

如您所见,查询大约需要2秒钟才能执行!

虽然下一个查询仅选择上次保存的值非常慢(大约34秒):

-property ResourceGroupName, StorageAccountName, Sku, @{l='Sku Name'; e={$_.Sku.Name}},  @{l='Sku Tier'; e={$_.Sku.Tier}}, Kind, Encryption, AccessTier

实际上,该表有311,814行,每天增加约4,600行。

如何加快选择表格?

2 个答案:

答案 0 :(得分:1)

您应该在列nome和data_ora上创建正确的索引 但您也可以尝试(使用或不使用索引)来使用此查询

SELECT `T1`.`nome`, `T1`.`valore`, `T2`.`data_ora` 
FROM `plc_data` `T1`
INNER JOIN (
      SELECT nome,  max(data_ora)  data_ora
      FROM plc_data 
      GROUP BY nome
 )  T2 on T1.name = t2.name 
      AND t1.data_ora = t2.data_ora

答案 1 :(得分:0)

data_ora表格上添加索引。这是最低限度。

一般的经验法则是:对于您使用的where子句中的每个字段组合,应该有一个索引,除非有一个索引以正确的顺序以子句中的字段开头。 / p>

示例:

WHERE field1 = x AND field2 = y AND field3 = z

=>您应该有field1, field2, field3的索引。

WHERE field1 = x and field2 = y

=>您不需要新索引。这由上面的索引涵盖。

WHERE field3 = x AND field2 = y AND field1 = z

=>您应该拥有field3, field2, field1的索引,除非您检测到查询优化器足够智能,可以重新排序where子句中的字段以使用您的第一个索引,这并非总是可行。

但最重要的是要记住:如果您有where子句,则必须有索引。