如何使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'
有没有办法让它跑得更快?我是否应该将whereDATE(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)