在每个查询中写入数据库名称比在每个页面加载时调用mysql_select_db()更快吗?

时间:2010-09-17 01:32:41

标签: php mysql performance query-optimization

我在一个相当大的网站工作;我们每月的页面浏览量约为4亿至5亿。我们使用PHP和MySQL。

目前我们的页面流程就像这样(为了清晰起见,半伪代码):

mysql_connect();
mysql_select_db('red');
mysql_query('SELECT * FROM apples');
mysql_query('SELECT * FROM cakes');

我的一位同事建议mysql_select_db减慢页面加载速度并增加数据库服务器的负载,并建议将我们的“流程”更改为:

mysql_connect();
mysql_query('SELECT * FROM red.apples');
mysql_query('SELECT * FROM red.cakes');

它会有所作为吗?我特别关注做出这一改变所需的时间;我们会看到任何明显的结果吗?

值得吗?

3 个答案:

答案 0 :(得分:8)

基准:

$ cat 1.php 
<?php
mysql_connect('localhost') or die(mysql_error());
mysql_select_db('test') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM foo') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM bar') or die(mysql_error());
?>
$ cat 2.php 
<?php
mysql_connect('localhost') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM test.foo') or die(mysql_error());
mysql_query('SELECT SQL_NO_CACHE * FROM test.bar') or die(mysql_error());
?>
$ time ( for i in {1..100} ; do php 1.php; done;)

real    0m3.554s
user    0m2.300s
sys     0m1.188s
$ time ( for i in {1..100} ; do php 2.php; done;)

real    0m3.555s
user    0m2.292s
sys     0m1.208s

我打电话给废话。

您的同事是否可能与mysql命令行客户端混淆,后者将加载所有表格和如果切换到数据库(可以通过-A开关避免使用),则为列名?

答案 1 :(得分:0)

我不确定你的问题,但我怀疑它会产生重大影响。

但还有其他可以做的事情。我建议您编写所有列名而不是使用*。我知道这肯定会加快你的疑问。

例如:

mysql_query('SELECT id, size, color FROM apples');

您可以做的其他事情是正确使用LIMIT。例如,如果您从数据库中选择用户,并且您确定它是唯一的,请在查询结束时使用LIMIT 1

例如:

SELECT id, username, access_level FROM users WHERE id = ? LIMIT 1

答案 2 :(得分:0)

如果添加数据库名称,我非常怀疑它会在性能上有所作为。

永远的连接和重构您的查询永远,我认为,选择*将是一个良好的第一步。然后,您可能想要考虑使用查询缓存,并查看慢速查询日志。这些将比一些小的语义差异更能帮助你,比如指定模式名称。