MySQL索引计算?

MySQL索引计算?,mysql,indexing,query-optimization,Mysql,Indexing,Query Optimization,我有一个查询,如果可能的话可以进行优化,因为运行它需要15秒 它正在查询一个包含大约1000000条记录的大型数据库,并通过按小时分组(这是从DATE_FORMAT()派生的)来降低速度 我为所有表中的所有相关字段编制了索引,这大大提高了性能,但我不知道如何为小时组创建索引,或者是否可以为小时组创建索引,因为它不是字段 我确实意识到数据集非常大,但我想知道我是否有任何选择 任何帮助都将不胜感激! 谢谢 选择'id`, tbl1.num, 名称 日期\格式(`timestamp`,'%x-%v')

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

它正在查询一个包含大约1000000条记录的大型数据库,并通过按小时分组(这是从DATE_FORMAT()派生的)来降低速度

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

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

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

选择'id`,
tbl1.num,
名称
日期\格式(`timestamp`,'%x-%v')为wknum,
日期\格式(`timestamp`,'%Y-%m-%d')作为日期,
日期格式(`timestamp`,'%H')为小时,
如果(代码0,代码描述“”)作为状态,
总和(时间到秒(`timeblock')/60作为时间,
求和(`distance`)作为距离,
和(`distance`)/(和(时间到秒(`timeblock`))/60)作为速度
从`tbl1`
在tbl1.code=tbl2.code上左连接'tbl2'
在tbl1.status=tbl3.status上左连接“tbl3”
在tbl1.conditionnum=tbl4.conditionnum上左连接'tbl4'
在tbl1.num=edm\u mc\u list.num上左连接'tbl5'
其中'timestamp`>'2013-07-28 00:00:00'
按'num',日期\格式('timestamp','%H'),'mcstatus'分组`

MySQL通常不能在列上使用索引,除非列是 在查询中被隔离隔离该列表示它不应是表达式的一部分,也不应位于查询中的函数内

解决方案:

1-您可以将小时与时间戳列分开存储。例如,您可以通过插入之前的
和更新之前的
触发器来存储它

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,就可以使用MariaDB。

MySQL通常不能在列上使用索引,除非列是 在查询中被隔离隔离该列表示它不应是表达式的一部分,也不应位于查询中的函数内

解决方案:

1-您可以将小时与时间戳列分开存储。例如,您可以通过插入之前的
和更新之前的
触发器来存储它

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,您也可以使用MariaDB。

如果您
按num、hour、mcstatus分组是否更好?MySQL可能正在重复日期格式(),这是不必要的,因为您已经在
SELECT
子句中进行了此操作。但一般的答案是,不可能对这样的计算值进行索引。Mysql将使用
时间戳的索引
作为
hour
@Barmar的索引。不幸的是,没有相同的结果,而且看起来我在这方面运气不佳。。。但好的一面是,我现在知道你可以在组中使用别名!不知道我为什么不试试!愚蠢的问题,但你需要使用左连接吗?左联接将选择左侧表中的所有行。使用内部联接将大大减少行数。只是一个建议,我没有太多的上下文来解释为什么您需要这些表格中的所有数据。如果您
按num、hour、mcstatus分组是否更好?MySQL可能正在重复日期格式(),这是不必要的,因为您已经在
SELECT
子句中进行了此操作。但一般的答案是,不可能对这样的计算值进行索引。Mysql将使用
时间戳的索引
作为
hour
@Barmar的索引。不幸的是,没有相同的结果,而且看起来我在这方面运气不佳。。。但好的一面是,我现在知道你可以在组中使用别名!不知道我为什么不试试!愚蠢的问题,但你需要使用左连接吗?左联接将选择左侧表中的所有行。使用内部联接将大大减少行数。只是一个建议,我没有太多的背景说明为什么你需要这些表格中的所有数据。