use*_*476 2 php mysql optimization performance
我试图为我的表创建一些统计数据,但它有超过300万行,所以它真的很慢.
我正在尝试为列找到最受欢迎的值,name并显示它弹出的次数.
我正在使用这个,但它不起作用,因为它太慢,我只是得到错误.
$total = mysql_query("SELECT `name`, COUNT(*) as b FROM `people` GROUP BY `name` ORDER BY `b` DESC LIMIT 0,5;")or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)
你可能会看到我正在尝试获取所有名称以及该名称被使用了多少次,但只显示前5名以希望加快它的速度.
我希望能够获得像这样的价值观
while($row = mysql_fetch_array($result)){
echo $row['name'].': '.$row['b']."\r\n";
}
Run Code Online (Sandbox Code Playgroud)
它会显示这样的事情;
Bob: 215
Steve: 120
Sophie: 118
RandomGuy: 50
RandomGirl: 50
Run Code Online (Sandbox Code Playgroud)
我不太关心以后订购名称,如RandomGirl和RandomGuy是错误的方式.
我想我已经提供了足够的信息.:)我希望这些名称尽可能不区分大小写.Bob应该与BoB,bOb,BOB等相同.
谢谢你的时间保罗
限制前5名的结果不会给你带来很多加速,你会在结果检索中获得时间,但在mySQL方面,整个表仍然需要被解析(计数).
您将加速在名称列上具有索引的计数查询,当然因为只解析索引而不是表.
现在,如果您真的想加快结果并避免在需要此结果时解析名称索引(如果您确实有数百万行,这仍然会很慢),那么唯一的其他解决方案是在插入,删除时计算统计数据或更新此表上的行.那就是在这个表上使用触发器来维护这个附近的统计表.那么你真的只在这个统计表上有一个简单的选择查询,只解析了5行.但是你会减慢插入,删除和更新操作的速度(这已经非常慢,特别是如果你维护索引,所以如果统计数据很重要,你应该研究这个解决方案).