我在一个相当大的网站工作;我们每月的页面浏览量约为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');
它会有所作为吗?我特别关注做出这一改变所需的时间;我们会看到任何明显的结果吗?
值得吗?
答案 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)
如果添加数据库名称,我非常怀疑它会在性能上有所作为。
永远的连接和重构您的查询永远,我认为,选择*将是一个良好的第一步。然后,您可能想要考虑使用查询缓存,并查看慢速查询日志。这些将比一些小的语义差异更能帮助你,比如指定模式名称。