我有一个查询需要12秒(日记表1.2m行),根本原因在下面
select 1
from
myTable myTable
join myJournal Journal on (Journal.status=0 and myTable.id = Journal.myTableId)
join arrival Arrival on (myTable.id = Arrival.myTableId)
join calc Calc on (myTable.id = Calculated.myTableId)
join ms ms on (Parent.id = ms.myTableId)
join perf Perf on (myTable.id = Perf.myTableId)
join ref Ref on (myTable.id = Ref.myTableId)
where
((myTable.name like 'cheese%' or
Journal.algorithm like 'cheese%' or --if this is removed, its fine <1sec
myTable.client like 'cheese%' or
myTable.something like 'cheese%'))
但是日记表执行正常。
select * from myJournal where algorithm like 'cheese%' --takes < 1 sec.
如果删除四个联接(在where子句中未使用),查询也可以正常执行。
当我加入3个以上的表时,性能会急剧/指数级下降。
答案 0 :(得分:0)
我首先将查询编写为:
select 1
from myTable t join
myJournal j
on t.id = j.myTableId
where j.status = 0 and
(t.name like 'cheese%' or
j.algorithm like 'cheese%' or
t.client like 'cheese%' or
t.something like 'cheese%'
)
那么,为此的最佳索引可能是myJournal(status, myTableId, algorithm)
和myTable(id, name, client, something)
。
这些索引主要用于join
和第一个过滤条件。他们对字符串比较没有多大帮助。但是,由于or
的条件,这些很难优化。