Php 创建索引以改善由订单导致的执行时间缓慢
我在PHP函数中有以下查询。根据许多因素,它会被调用多次,但即使只执行一次,也需要很长时间Php 创建索引以改善由订单导致的执行时间缓慢,php,mysql,sql,indexing,phpmyadmin,Php,Mysql,Sql,Indexing,Phpmyadmin,我在PHP函数中有以下查询。根据许多因素,它会被调用多次,但即使只执行一次,也需要很长时间 SELECT `date` as dateTo FROM table_name tbl WHERE `colA` = 223 and `colB` <> 1 ORDER BY `date` DESC LIMIT 1 这个索引,INDEXcolA,colB,date你必须为colA和colB添加索引。这将解决问题 您必须为可乐和可乐添加索引。这将解决问题 这是您的查询: SELE
SELECT `date` as dateTo
FROM table_name tbl
WHERE `colA` = 223 and `colB` <> 1
ORDER BY `date` DESC
LIMIT 1
这个索引,INDEXcolA,colB,date你必须为colA和colB添加索引。这将解决问题 您必须为可乐和可乐添加索引。这将解决问题 这是您的查询:
SELECT `date` as dateTo
FROM table_name tbl
WHERE `colA` = 223 and `colB` <> 1
ORDER BY `date` DESC
LIMIT 1
子查询应该能够使用表_namecolA,date上的查询。它需要具体化整个结果集,但是选择colb1应该非常快。我对这种方法并不感到兴奋,因为它假设当外部查询读取子查询时,子查询仍然是有序的——但在MySQL中也是如此。这是您的查询:
SELECT `date` as dateTo
FROM table_name tbl
WHERE `colA` = 223 and `colB` <> 1
ORDER BY `date` DESC
LIMIT 1
子查询应该能够使用表_namecolA,date上的查询。它需要具体化整个结果集,但是选择colb1应该非常快。我对这种方法并不感到兴奋,因为它假设当外部查询读取子查询时,子查询仍然是有序的——但在MySQL中确实如此。您必须在date、colA、colB上添加索引。 请记住索引的顺序
ALTER TABLE table_name ADD KEY index_name (date, colA, colB);
你必须在日期、可乐、可乐上加一个索引。 请记住索引的顺序
ALTER TABLE table_name ADD KEY index_name (date, colA, colB);
colB中有多少不同的值?如果它只能有0和1,则将过滤器更改为
colB = 0
再加上这个
INDEX(colA, colB, date)
日期必须是最后一个,但A和B可以是任意顺序。只有这样,索引才能处理所有筛选和排序
如果colB有2个以上的值,那么让我们稍微改进一下Gordon的解决方案:
SELECT `date` as dateTo
FROM table_name tbl
WHERE `colA` = 223
AND colB <> 1
ORDER BY `date` DESC;
使用INDEXcolA、colB、date,列的顺序正好如此。该指数将是一个覆盖指数。colB中有多少不同的值?如果它只能有0和1,则将过滤器更改为
colB = 0
再加上这个
INDEX(colA, colB, date)
日期必须是最后一个,但A和B可以是任意顺序。只有这样,索引才能处理所有筛选和排序
如果colB有2个以上的值,那么让我们稍微改进一下Gordon的解决方案:
SELECT `date` as dateTo
FROM table_name tbl
WHERE `colA` = 223
AND colB <> 1
ORDER BY `date` DESC;
使用INDEXcolA、colB、date,列的顺序正好如此。此索引将是一个覆盖索引。目前存在什么索引?最好的索引是INDEXdate、colA、colA、colA上的多列索引,colB请注意,索引应该按照我说的方式对列进行排序。有多少行会被选中并需要排序?@RiggsFolly该表是按降序排序的,因此所有记录都会被排序。@RaymondNijland如果您添加注释作为答案,我会选择它。当前存在什么索引?最好的索引是一个多列索引INDEXdate,colA,colB请注意索引应该按照我说的方式对列进行排序。有多少行会被选中并需要排序?@RiggsFolly该表是按降序排序的,因此所有记录都会被排序。@RaymondNijland如果您添加注释作为答案,我会选择它。第二种方法确实缩短了执行时间,谢谢,我也将尝试索引。第二种方法确实提高了执行时间,多亏了,我也将尝试索引。启动一个组合索引,将列作为范围进行比较,或按顺序使用,几乎总是次优的。从date开始,优化器可以使用orderby的索引,但不能对colA进行过滤。一个缓解因素是,它是一个覆盖索引,因为它包含查询所需的所有列。使用列作为范围进行比较或按顺序使用来启动复合索引几乎总是次优的。从date开始,优化器可以使用orderby的索引,但不能对colA进行过滤。一个缓解因素是它是一个覆盖索引,因为它包含查询所需的所有列。在这种情况下,索引是INDEXcolA,colB,date吗?索引在INDEXcolA,colB,date中起作用,而且速度更快。谢谢,我的错。修正了我的答案。然后,have并不比WHERE好,也可能比WHERE差,所以将colB测试折叠到WHERE。have需要在订单之前完成。在这种情况下,索引是INDEXcolA,colB,date吗?索引在INDEXcolA,colB,date中起作用,而且速度更快。谢谢,我的错。修正了我的答案。然后,拥有并不比WHERE好,也可能比WHERE差,所以将colB测试折叠到WHERE中。