我有一个包含以下信息的数据库:
表报告: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
答案 0 :(得分:3)
据我所知,全文索引不适合排序。并且您正在使用公司列对结果进行排序。
让我试着简单地解释一下全文:
id company
1 "brown fox"
2 "something of fox"
你的全文索引会为单词创建一个btree:“brown, something, fox
”所以你可以匹配这些单词,但据我所知它不会帮助你排序。
因此,如果您使用全文索引来获取“狐狸”公司,请保留它。但是要在公司上加上btree索引以进行分类。
答案 1 :(得分:0)
您尚未列出表索引,但尝试创建以下3个索引
报告表上的(已发布,已删除,公司,ID)
在report_content表(报告,公司)上
在公司表(id)