Joe*_*oel 30 php sql performance
我只是想知道哪种方法最有效,如果我真的只想获得表中的行数.
$res = mysql_query("SELECT count(*) as `number` FROM `table1`");
$count = mysql_fetch_result($res,0,'number');
Run Code Online (Sandbox Code Playgroud)
要么
$res = mysql_query("SELECT `ID` FROM `table1`");
$count = mysql_num_rows($res);
Run Code Online (Sandbox Code Playgroud)
有人做过任何体面的测试吗?
Vol*_*erK 30
mysql_query()在返回之前将所有结果记录从MySQL传输到php pcrocess(与mysql_unbufferd_query()不同).仅此一点就会使mysql_num_rows()版本变慢.
此外,对于某些引擎(如MyISAM),MySQL可以从表的索引提供Count(*)请求,而不会访问实际数据.SELECT * FROM foo另一方面,A 导致全表扫描,MySQL必须读取每个数据集.
在数据库中测试超过2300000行,使用xhprof键入:InnoDB,大小接近1 GiB
测试1:
....SELECT COUNT(id) as cnt FROM $table_name....;
row= mysqli_fetch_assoc($res2);
echo $row['cnt'];
//result1:
1,144,106
1,230,576
1,173,449
1,163,163
1,218,992
Run Code Online (Sandbox Code Playgroud)
测试2:
....SELECT COUNT(*) as cnt FROM $table_name....;
row= mysqli_fetch_assoc($res2);
echo $row['cnt'];
//result2:
1,120,253
1,118,243
1,118,852
1,092,419
1,081,316
Run Code Online (Sandbox Code Playgroud)
TEST3:
....SELECT * FROM $table_name....;
echo mysqli_num_rows($res2);
//result3:
7,212,476
6,530,615
7,014,546
7,169,629
7,295,878
Run Code Online (Sandbox Code Playgroud)
TEST4:
....SELECT * FROM $table_name....;
echo mysqli_num_rows($res2);
//result4:
1,441,228
1,671,616
1,483,050
1,446,315
1,647,019
Run Code Online (Sandbox Code Playgroud)
结论: 最快的方法是在test2中:
....SELECT COUNT(*) as cnt FROM $table_name....;
row= mysqli_fetch_assoc($res2);
echo $row['cnt'];
Run Code Online (Sandbox Code Playgroud)
绝对是第一个.MySQL的通常可以通过看一个指标,而不是整个表中做到这一点,如果你使用MyISAM(默认值),该行数的表存储在表中的元数据,并会退回瞬间.
您的第二种方法不仅会将整个表读入内存,还会在客户端对行进行计数之前通过网络将其发送到客户端.非常浪费!