我在一个相当大的网站工作;我们每个月有大约4-5亿的页面浏览量。我们使用PHP和MySQL。
目前我们的页面流是这样工作的(为了清楚起见,半伪代码):
mysql_connect();
mysql_select_db('red');
mysql_query('SELECT * FROM apples');
mysql_query('SELECT * FROM cakes');我的一位同事建议mysql_select_db减慢页面加载速度并增加DB服务器的负载,并建议将我们的“流”更改为:
mysql_connect();
mysql_query('SELECT * FROM red.apples');
mysql_query('SELECT * FROM red.cakes');它真的会有所不同吗?我特别关心做出这种改变所需要的时间;我们会看到任何明显的结果吗?
值得吗?
发布于 2010-09-17 09:54:37
基准:
$ 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开关避免),mysql命令行客户端将加载所有的表名和列名。
发布于 2010-09-17 09:55:15
我不能肯定你的问题,但我怀疑这会有很大的不同。
但是还有其他的东西可以让你。我建议您编写所有的列名,而不是使用*。我确信这会加快你的查询速度。
例如:
mysql_query('SELECT id, size, color FROM apples');你可以做的另一件事是正确地使用LIMIT。例如,如果您正在从数据库中选择一个用户,并且您确信该用户是惟一的,那么在查询的末尾使用LIMIT 1。
例如:
SELECT id, username, access_level FROM users WHERE id = ? LIMIT 1发布于 2010-09-17 12:41:13
我非常怀疑,如果您添加数据库名称,是否会在性能方面有所不同。
我认为,持久连接和将查询重构为永不选择*将是一个很好的第一步。然后,您可能想要考虑使用查询缓存,并查看一下您缓慢的查询日志。比起一些小的语义差异,比如指定模式名称,这些方法将会给您带来更多的帮助。
https://stackoverflow.com/questions/3732116
复制相似问题