我会尝试快速解释自己。 我有一个名为“artikli”的数据库,其中包含大约 100 万条记录。 在这张表上,我运行了很多不同的查询,但是当存在 ORDER by 时,有 1 个特别导致问题(执行时间长)。
这是我的表结构:
CREATE TABLE IF NOT EXISTSartikli
(id
int(11) NOT NULL,name
varchar(250) NOT NULL,datum
datetime NOT NULL,kategorije_id
int(11) default NULL,id_valute
int(11) default NULL,podogovoru
int(1) default '0',cijena
decimal(10,2) default NULL,valuta
int(1) NOT NULL default '0',cijena_rezerva
decimal(10,0) NOT NULL,cijena_kupi
decimal(10,0) default NULL,cijena_akcija
decimal(10,2) NOT NULL,period
int(3) NOT NULL default '30',dostupnost
enum('svugdje','samobih','samomojgrad','samomojkanton') default 'svugdje',zemlja
varchar(10) NOT NULL,slike
varchar(500) NOT NULL,od_s
varchar(34) default NULL,od_id
int(10) unsigned default NULL,vrsta
int(1) default '0',trajanje
datetime default NULL,izbrisan
int(1) default '0',zakljucan
int(1) default '0',prijava
int(3) default '0',izdvojen
decimal(1,0) NOT NULL default '0',izdvojen_kad
datetime NOT NULL,izdvojen_datum
datetime NOT NULL,sajt
int(1) default '0', PRIMARY KEY (id
), KEYbrend
(brend
), KEYkanton
(kanton
), KEYdatum
(datum
), KEYcijena
(cijena
), KEYkategorije_id
(kategorije_id
,podogovoru
,sajt
,izdvojen
,izdvojen_kad
,datum
) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
And this is the query:
SELECT artikli.datum as brojx,
artikli.izdvojen as i,
artikli.izdvojen_kad as ii,
artikli.cijena as cijena, artikli.name
FROM artikli
WHERE artikli.izbrisan=0 and artikli.prodano!=3
and artikli.zavrseno=0 and artikli.od_id!=0
and (artikli.sajt=0 or (artikli.sajt=1 and artikli.dostupnost='svugdje'))
and kategorije_id IN (18)
ORDER by i DESC, ii DESC, brojx DESC
LIMIT 0,20
我想做的是避免非常慢的 Filesort。
最佳答案
如果您为查询提供了解释计划,那将是一个很大的帮助。
为什么您认为是文件排序导致了问题?查看查询,您似乎应用了很多过滤 - 应该显着减少输出集 - 但没有一个可以使用可用索引。
artikli.izbrisan=0 and artikli.prodano!=3
and artikli.zavrseno=0 and artikli.od_id!=0
and (artikli.sajt=0 or (artikli.sajt=1 and artikli.dostupnost='svugdje'))
and kategorije_id IN (18)
虽然我不知道你的数据模式是什么,但我怀疑你可能会通过添加索引获得更多好处:
kategorije_id,izbrisan,sajt
是否真的已经使用了所有其他索引?
虽然通过对所有这些 bool 值进行非规范化,您会获得很多更多的 yield (假设表已规范化,并且其中没有隐藏的函数依赖项)。
C.
关于mysql 查询优化(错误的索引?)避免文件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078979/