SQL1:SELECT COUNT(*) FROM table1 WHERE (displayorder>='0' or displayorder='-2' ) and zplb0='954'
SQL2:select * from table1 WHERE (displayorder>='0' or displayorder='-2' ) and zplb0='954' order by lastpost desc limit 0,36
SELECT COUNT(*) FROM table1 有32萬條數(shù)據(jù)
SELECT COUNT(*) FROM table1 WHERE zplb0='954' 有10萬條數(shù)據(jù)
SELECT COUNT(*) FROM table1 WHERE (displayorder>='0' or displayorder='-2' ) and zplb0='954' 有10萬條數(shù)據(jù)
or條件可以使用類似
select * from table1 WHERE displayorder>='0' and zplb0='954'
union all
select * from table1 where displayorder='-2' and zplb0='954'
這樣的語句。
索引可以嘗試displayorder+zplb0+lastpost
1、由于滿足where條件的記錄數(shù)占全表的比重比較大(10W/32W),而且sql2是select *,也不能使用索引覆蓋掃描。
優(yōu)化器認(rèn)為索引還沒有全表掃描快
2、由于where 條件中displayorder是范圍查找,排序并不會(huì)使用`zplb0`索引(`zplb0`,`displayorder`都是等值查找才會(huì)使用),
所以order by lastpost會(huì)引起Using filesort
sql2優(yōu)化建議:
select t2.* from (select 主鍵ID from table1 WHERE (displayorder>='0' or displayorder='-2' ) and zplb0='954' order by lastpost desc limit 0,36 ) as t1
,table1 AS t2
where t1.主鍵ID=t2.主鍵ID;