Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.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查询运行得更快_Php_Mysql_Sql - Fatal编程技术网

如何使php中的mysql查询运行得更快

如何使php中的mysql查询运行得更快,php,mysql,sql,Php,Mysql,Sql,我正在具有数千行的表上运行查询: $sql="select * from call_history where extension_number = '0536*002' and flow = 'in' and DATE(initiated) = '".date("Y-m-d")."' "; 而且要花很长时间才能返回结果 SQL本身是 select * from call_history where extension_number = '0536*002' and f

我正在具有数千行的表上运行查询:

$sql="select * from call_history where extension_number = '0536*002' and flow = 'in' and DATE(initiated) = '".date("Y-m-d")."' ";
而且要花很长时间才能返回结果

SQL本身是

 select * 
   from call_history 
  where extension_number = '0536*002'
    and flow = 'in' 
    and DATE(initiated) = 'dateFromYourPHPcode'
有没有办法让它跑得更快?我是否应该将where
DATE(initiated)='.DATE(“Y-m-d”).'
放在
分机号之前


或者我应该选择所有行,其中
DATE(initiated)='.DATE(“Y-m-d”)。“
并将其放入while循环中,然后运行所有其他查询
(其中扩展名为=…)
whith whith while循环?

以下是一些建议:

1) 将
选择*
替换为所需的唯一字段

2) 在要作为输出的表字段上添加索引

3) 避免在循环中运行查询。这会导致对SQL server的多个请求

4) 一次获取所有数据

5) 根据需要应用
LIMIT
标签。不要选择所有记录

6) 触发两个不同的查询:一个用于计算记录总数,另一个用于获取每页记录数(例如10、20、50等)

7) 如果适用,创建数据库视图并从中而不是从表中获取数据。
谢谢

您应该将索引添加到表中。这样MySql将获取更快的速度。我还没有测试,但命令应该是这样的:

ALTER TABLE `call_history ` ADD INDEX `callhistory` (`extension_number`,`flow`,`extension_number`,`DATE(initiated)`);

下的子句顺序,其中
与优化无关

专业提示,也有人建议:不要在程序中的查询中使用
SELECT*
除非你有充分的理由这么做。“我不想写下我需要的栏目名称”不是一个很好的理由。始终枚举所需的列。当您需要的数据列列表可用时,MySQL和其他数据库系统通常可以以令人惊讶的方式优化内容

您的查询包含此选择条件

AND DATE(initiated) = 'dateFromYourPHPcode'
请注意,此搜索条件采用以下形式

FUNCTION(column) = value
这种形式的搜索无法在该列上使用任何索引。您的
initiated
列具有
时间戳
数据类型。请尝试以下方法:

 AND initiated >= 'dateFromYourPHPcode'
 AND initiated <  'dateFromYourPHPcode' + INTERVAL 1 DAY

如果您的查询需要良好的性能,您应该要求数据库管理员添加此索引。

Databases 101:使用EXPLAIN分析SQL查询,并学习为数据表编制索引。您可以向我们展示表结构吗?这是一个屏幕截图:一个屏幕截图?不用了,谢谢。为我们提供适当的DDL并解释您不选择的列的索引是什么?索引应位于排序依据或筛选依据的列上。
 ALTER TABLE call_history 
   ADD INDEX flowExtInit (flow, extension_number, initiated)