【问题标题】:How to make this query run faster如何使这个查询运行得更快
【发布时间】:2014-11-29 11:27:59
【问题描述】:

我想知道这个查询是否可以运行得更快,或者如果可能的话如何使它更快。

$result = mysql_query("select
(select count(1) FROM videos WHERE title LIKE '%Cars%')as Cars,
(select count(1) FROM videos WHERE title LIKE '%Bikes%') as 'Bikes',
(select count(1) FROM videos WHERE title LIKE '%Airplanes%') as 'Airplanes',
(select count(1) FROM videos WHERE title LIKE '%Trucks%') as 'Trucks',
(select count(1) FROM videos WHERE title LIKE '%Games%') as 'Games'");

$row = mysql_fetch_assoc($result);

foreach($row as $title => $total)
{
  echo '<li>
<a href="search.php?search='. $title . '&submit= ">'. $title.'&nbsp;&nbsp;'. $total .'</a></li>';
}

echo '<li class="spaceIN"></li><li class="letter">A</li>';

我复制了这个脚本并粘贴了 100 次,然后加载速度真的很慢。

【问题讨论】:

  • 如果SELECT查询INSERT/UPDATE/DELETE的比率很大,可以将这些计数器存储在单独的表中,并在更新videos表时更新它们.

标签: php mysql performance select count


【解决方案1】:

这样

select sum(title LIKE '%Cars%') as cars,
       sum(title LIKE '%Bikes%') as bikes
from videos

【讨论】:

  • 谢谢,这要快得多。
【解决方案2】:

连同其他答案中的 SQL 建议 - 与其在每次有人访问该页面时都运行该查询(假设是这样) - 而是将计数存储在数据库中并让 Cron 作业运行脚本来更新它们在后台定期。然后查询该页面上存储的计数 - 这显然会快得多

【讨论】:

    【解决方案3】:

    您可以将 select 列表中的内联查询替换为布尔表达式上的 sum 函数:

    SELECT SUM (title LIKE '%Cars%') as Cars,
           SUM (title LIKE '%Bikes%') as 'Bikes',
           SUM (title LIKE '%Airplanes%') as 'Airplanes',
           SUM (title LIKE '%Trucks%') as 'Trucks',
           SUM (title LIKE '%Games%') as 'Games'
    FROM   videos
    

    【讨论】:

      【解决方案4】:

      添加类别列,int 或 enum,取决于您添加/更改类别的频率。你可以使用:

      SELECT COUNT(*) as c, category FROM videos GROUP BY category;
      

      那么。 Waaaay 更好地定义类别而不是必须在每个查询上做字符串的东西。开头的 '%' 也很慢,因为它不能使用索引。

      【讨论】:

      • 感谢您的回答。但是为什么'%'很慢,我应该删除它吗?
      • 为什么 '%' 慢 如果您必须阅读书中的每个字符才能找到包含“汽车”的每个句子,那会比翻到索引更慢找到汽车?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多