mysql命令由vs where子句表现

时间:2011-03-03 08:35:05

标签: mysql performance

我有一个包含以下信息的数据库:

表报告:166211记录
table report_content:166211记录
表公司:13188条记录

此查询处理时间为41.7324秒:

select rc.* from `reports` r
left join `report_content` rc on rc.`report`=r.`id`
left join `companies` c on c.`id`=r.`company`
where not isnull(r.`published`) and not r.`deleted`
order by rc.`company` asc
limit 50

此查询需要1.6146秒来处理:
我添加了 rc。company!=''

select rc.* from `reports` r
left join `report_content` rc on rc.`report`=r.`id`
left join `companies` c on c.`id`=r.`company`
where not isnull(r.`published`) and not r.`deleted`
and rc.`company` != ''
order by rc.`company` asc
limit 50

我在rc.company上有全文索引,基数为11872 所有其他子句/连接字段都有btree索引(主要是主要的)

为什么会这样?我应该在varchar(255)上使用fulltext / btree索引吗? 我的想法是没有 rc。company!=''

仅供参考,表格为MyISAM

注意:添加的条件不会改变结果,只是将rc.company添加到条件中(这会加快查询速度),并想知道它是否优雅?

<小时/> 更新:谢谢Frail,结果如下:

查询A:

1   SIMPLE  r   range   published   published   9   NULL    156085  Using where; Using temporary; Using filesort
1   SIMPLE  rc  ref     report  report  4   database.r.id   1    
1   SIMPLE  c   eq_ref  PRIMARY     PRIMARY     4   database.r.company  1   Using index

查询B:

1   SIMPLE  rc  ALL     report,company  NULL    NULL    NULL    166339  Using where; Using filesort
1   SIMPLE  r   eq_ref  PRIMARY,published   PRIMARY     4   database.rc.report  1   Using where
1   SIMPLE  c   eq_ref  PRIMARY     PRIMARY     4   database.r.company  1   Using index

2 个答案:

答案 0 :(得分:3)

据我所知,全文索引不适合排序。并且您正在使用公司列对结果进行排序。

让我试着简单地解释一下全文:

id company
1 "brown fox"
2 "something of fox"

你的全文索引会为单词创建一个btree:“brown, something, fox”所以你可以匹配这些单词,但据我所知它不会帮助你排序。

因此,如果您使用全文索引来获取“狐狸”公司,请保留它。但是要在公司上加上btree索引以进行分类。

答案 1 :(得分:0)

您尚未列出表索引,但尝试创建以下3个索引

报告表上的

(已发布,已删除,公司,ID)
在report_content表(报告,公司)上 在公司表(id)