【问题标题】:MySQL Index calculation?MySQL索引计算?
【发布时间】:2023-03-30 05:30:01
【问题描述】:

如果可能的话,我有一个可以进行优化的查询,因为它需要 15 秒才能运行。

它正在查询一个包含大约 1000000 条记录的大型数据库,并且会因按小时分组而减慢速度(源自 DATE_FORMAT())。

我为所有表中的所有相关字段编制了索引,这显着提高了性能,但我不知道如何或是否可以为小时组创建索引,因为它不是字段...

我确实意识到数据集非常大,但我想知道我是否有任何选择。

任何帮助将不胜感激! 谢谢!

SELECT  `id`,
    tbl1.num,
    name,
    DATE_FORMAT(`timestamp`,'%x-%v') AS wknum,
    DATE_FORMAT(`timestamp`,'%Y-%m-%d') AS date,
    DATE_FORMAT(`timestamp`,'%H') as hour,
    IF(code<>0,codedescription,'') AS status,
    SUM(TIME_TO_SEC(`timeblock`))/60 AS time, 
    SUM(`distance`) AS distance, 
    SUM(`distance`)/(SUM(TIME_TO_SEC(`timeblock`))/60) AS speed
FROM  `tbl1`
LEFT JOIN `tbl2` ON tbl1.code = tbl2.code 
LEFT JOIN `tbl3` ON tbl1.status = tbl3.status 
LEFT JOIN `tbl4` ON tbl1.conditionnum = tbl4.conditionnum 
LEFT JOIN `tbl5` ON tbl1.num = edm_mc_list.num
WHERE `timestamp`>'2013-07-28 00:00:00'
GROUP BY `num`,DATE_FORMAT(`timestamp`,'%H'),`mcstatus`

【问题讨论】:

  • GROUP BY num, hour, mcstatus会不会更好? MySQL 可能会重复 DATE_FORMAT(),这是不必要的,因为您已经在 SELECT 子句中这样做了。
  • 但一般的答案是不可能像这样索引计算值。
  • Mysql 将使用timestamp 的索引为hour
  • @Barmar 不幸的是没有相同的结果,看起来我对这个不走运......但从好的方面来说,我现在知道你可以在 group by 中使用别名!不知道为什么我没有尝试!
  • 愚蠢的问题,但您需要使用左连接吗?左连接将选择左侧表中的所有行。使用内部连接将大大减少行数。只是一个建议,我没有太多关于为什么需要这些表中的所有数据的上下文。

标签: mysql indexing query-optimization


【解决方案1】:

MySQL 通常不能在列上使用索引,除非列是 在查询中隔离。 隔离该列意味着它不应成为表达式的一部分或位于查询中的函数内部。

解决方案:

1-您可以将小时与timestamp 列分开存储。例如,您可以通过 before insertbefore update 触发器来存储它。

DELIMITER $$
CREATE TRIGGER `before_update_hour`
BEFORE UPDATE ON `tbl1`
FOR EACH ROW
BEGIN
     IF NEW.`timestamp` != OLD.`timestamp` THEN
       SET NEW.`hour` = DATE_FORMAT( NEW.`timestamp`,'%H')
     END IF;
END;
$$
DELIMITER ;

 DELIMITER $$
 CREATE TRIGGER `before_insert_hour`
 BEFORE INSERT ON `tbl1`
 FOR EACH ROW
 BEGIN
     SET NEW.`hour` = DATE_FORMAT( NEW.`timestamp`,'%H')
 END;
 $$
 DELIMITER ;

2-如果可以使用MariaDB,可以使用MariaDBvirtual columns

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2019-07-10
    • 2018-05-06
    相关资源
    最近更新 更多