Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在每个查询中写入数据库名称是否比在每次页面加载时调用mysql\u select\u db()更快?_Php_Mysql_Performance_Query Optimization - Fatal编程技术网

Php 在每个查询中写入数据库名称是否比在每次页面加载时调用mysql\u select\u db()更快?

Php 在每个查询中写入数据库名称是否比在每次页面加载时调用mysql\u select\u db()更快?,php,mysql,performance,query-optimization,Php,Mysql,Performance,Query Optimization,我在一个相当大的网站工作;我们每月有约4-5亿次页面浏览量。我们使用PHP和MySQL 目前,我们的页面流是这样工作的(为了清晰起见,半伪代码): 我的一位同事建议mysql\u select\u db降低页面负载并增加数据库服务器的负载,并建议将我们的“流”更改为: mysql_connect(); mysql_query('SELECT * FROM red.apples'); mysql_query('SELECT * FROM red.cakes'); 这真的会有所不同吗?我特别关心做

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

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

我的一位同事建议
mysql\u select\u db
降低页面负载并增加数据库服务器的负载,并建议将我们的“流”更改为:

mysql_connect();
mysql_query('SELECT * FROM red.apples');
mysql_query('SELECT * FROM red.cakes');
这真的会有所不同吗?我特别关心做出这种改变所需的时间;我们会看到明显的结果吗

值得吗?

基准:

$ 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
$cat 1.php
$cat 2.php
$time(对于{1..100}中的i;dophp1.php;done;)
真正的0m3.554s
用户0m2.300s
sys 0m1.188s
$time(对于{1..100}中的i;dophp2.php;done;)
实际0m3.555s
用户0m2.292s
系统0m1.208s
我称之为胡说八道


您的同事是否会与mysql命令行客户机混淆,如果切换到数据库,mysql命令行客户机将加载所有表名和列名(这可以通过
-a
开关避免)

我不确定你的问题,但我怀疑这会有重大影响

但是还有其他的事情可以让你成功。我建议你写下所有的列名,而不是使用
*
。我确信这将加快您的查询速度

例:

您可以做的另一件事是正确使用LIMIT。例如,如果您正在从数据库中选择一个用户,并且您确信该用户是唯一的,请在查询结束时使用
limit1

例:


我非常怀疑,如果添加数据库名称,在性能方面会有所不同


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

您是否考虑过使用memcache,这样您就不必在每个页面视图上读取数据库?@meder:是的,我们使用它,但这还不够,我们的数据库服务器经常超载如果您正在寻找优化提示,您应该发布更多关于db服务器和对它的调用的规范,以及如何集成memcache@meder:我不是在寻找优化的技巧,我只是想特别了解一下这一点。
SELECT*
就是一个例子,顺便说一句,我无法想象这会带来足够的不同,值得一试,特别是当你有三到四列以上的时候。也许不是从性能的角度来看,但肯定是错误跟踪(即:表更改失败得更加透明)。让你有更多的时间来研究更好的原因:Pi在大循环上运行了一些测试,差异似乎很大。大概有一半的等待时间。也许我测试得不对。我应该如何运行测试?在空闲的服务器上,禁用查询缓存,等等。fwiw:如果我像我的另一个问题一样在选择所有列时运行测试,
select*
大约慢2%,实际上没有多大收益。当您可以在不需要BLOB/TEXT列的情况下避免它们时,收益可能会很大。
$ 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_query('SELECT id, size, color FROM apples');
SELECT id, username, access_level FROM users WHERE id = ? LIMIT 1