求mysql 查询速度很慢(记录超过200W条)的解决方案,谢谢

x5570478 2009-07-09 09:07:00
代码如下: 需要根据不同的搜索条件进行过滤,结果需要分页。
$major = trim($_GET["major"]);
$area = trim($_GET["area"]);
$tel = trim($_GET["tel"]);
$contactor = trim($_GET["contactor"]);
$cpname = trim($_GET["cpname"]);
if($major!=""){
$query.=' and (major like "%'.$major.'%")';
}
if($area!=""){
$query.=' and (area like "%'.$area.'%")';
}
if($cpname!=""){
$query.=' and (company_name like "%'.$cpname.'%")';
}
if($tel!=""){
$query.=' and (telphone="'.$tel.'")';
}
if($contactor!=""){
$query.=' and (contactor="'.$contactor.'")';
}

$sql = 'SELECT count(1) as cnt FROM company WHERE 1=1 ';
$sql.= $query;

$cnt = $GLOBALS['db']->getOne($sql);

$sql = 'SELECT company_name,url,address FROM company WHERE 1=1 ';
$sql.= $query;
$sql.= ' limit '.(($page-1) * $size).",".$size;

$res = $GLOBALS['db']->getAll($sql);
$arr = array();
foreach ($res AS $idx => $row)
{
$arr[$idx]['title'] = str_replace($major,("<font color=\"#CC0033\">".$major."</font>"),$row['company_name']);
$arr[$idx]['title'] = str_replace($area,("<font color=\"#CC0033\">".$area."</font>"),$arr[$idx]['title']);
$arr[$idx]['title'] = str_replace($cpname,("<font color=\"#CC0033\">".$cpname."</font>"),$arr[$idx]['title']);
$arr[$idx]['company_name'] = $row['company_name'];
$arr[$idx]['url'] = $row['url'];
$arr[$idx]['address'] = str_replace($area,("<font color=\"#CC0033\">".$area."</font>"),$row['address']);
}
...全文
502 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuli86122068 2009-07-11
  • 打赏
  • 举报
回复
简历索引,优化查询语句
foolbirdflyfirst 2009-07-10
  • 打赏
  • 举报
回复
贴出最终你认为慢的sql,explian信息贴出来。
fxs_2008 2009-07-10
  • 打赏
  • 举报
回复
看楼上的说法
数据库不是无所不能的
dzxccsu 2009-07-10
  • 打赏
  • 举报
回复
like %%这样的查询是很慢的,何况你的数据超过200W。可以按LS的方法
「已注销」 2009-07-10
  • 打赏
  • 举报
回复
Mysql的like查询是低效的,特别是 %在开头的情况(完全无法利用索引)。 建议:
1. 缓存查询结果
2. 使用第三方搜索工具,如sphinx
x5570478 2009-07-10
  • 打赏
  • 举报
回复
为什么大家都不仔细看代码呢。

if($major!=""){
$query.=' and (major like "%'.$major.'%")';
}
if($area!=""){
$query.=' and (area like "%'.$area.'%")';
}
if($cpname!=""){
$query.=' and (company_name like "%'.$cpname.'%")';
}
if($tel!=""){
$query.=' and (telphone="'.$tel.'")';
}
if($contactor!=""){
$query.=' and (contactor="'.$contactor.'")';
}
tianyaxiao 2009-07-10
  • 打赏
  • 举报
回复
关注......
foolbirdflyfirst 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 x5570478 的回复:]
SQL code

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE company ALL NULL NULL NULL NULL 2383828 Using where



[/Quote]
???
你explian的什么样的sql语句?
未使用到任何索引而整表扫描,除了要建相关索引外,还要注意语句可以有效使用建立好的索引进行搜索。
x5570478 2009-07-10
  • 打赏
  • 举报
回复

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE company ALL NULL NULL NULL NULL 2383828 Using where

foolbirdflyfirst 2009-07-10
  • 打赏
  • 举报
回复
type -> ALL 全表扫描
key-> NULL 未用到任何索引

你的语句是什么?考虑给相关列建立索引,使用like 'something%'这样的语句,而不是like '%something%'
dhgdmw 2009-07-10
  • 打赏
  • 举报
回复
用了like,查的慢是正常的
x5570478 2009-07-10
  • 打赏
  • 举报
回复

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE company ALL NULL NULL NULL NULL 2383828 Using where

phpboy 2009-07-09
  • 打赏
  • 举报
回复

$sql = 'SELECT count(1) as cnt FROM company WHERE 1=1 ';
$sql.= $query;

$cnt = $GLOBALS['db']->getOne($sql);

$sql = 'SELECT company_name,url,address FROM company WHERE 1=1 ';
$sql.= $query;
$sql.= ' limit '.(($page-1) * $size).",".$size;



整个页面有二个查询,第一个是统计所有条数的吧。不知道 count(1)是什么意思?


$sql = 'SELECT count(*) as cnt FROM company WHERE 1=1 ';


整个条件查询是用 like 实现的, 感觉是导致查询慢的主要原因。

可以考虑将部分查询条件设置成 固定选择性的,然后查询语句可以少用一点 like 了
x5570478 2009-07-09
  • 打赏
  • 举报
回复
现在是这样的啊。请仔细看下代码 谢谢
ACMAIN_CHM 2009-07-09
  • 打赏
  • 举报
回复

这是你PHP上根据用户输入来生成不同的SELECT 语句的 WHERE 部分。

一般是用多个判断 来实现。
x5570478 2009-07-09
  • 打赏
  • 举报
回复
恩。
这个表里面存的都是企业黄页信息,有地区,行业,公司名称的字段
现在需要有个搜索功能,能根据不同的搜索条件,获取相应的结果
说清楚了吗?
ACMAIN_CHM 2009-07-09
  • 打赏
  • 举报
回复

建议举例说明你的需求。否则靠猜测会浪费大量的时间在确认需求上。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧