mysql 查询优化(错误的索引?)避免文件排序

标签 mysql optimization indexing filesort

我会尝试快速解释自己。 我有一个名为“artikli”的数据库,其中包含大约 100 万条记录。 在这张表上,我运行了很多不同的查询,但是当存在 ORDER by 时,有 1 个特别导致问题(执行时间长)。

这是我的表结构:

CREATE TABLE IF NOT EXISTS artikli (
  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),
  KEY brend (brend),
  KEY kanton (kanton),
  KEY datum (datum),
  KEY cijena (cijena),
  KEY kategorije_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/

相关文章:

php - 内容聚合服务策略

php - 正确使用mysql查询

python - Pandas Dataframe 索引错误

python - 在 numpy 中使用二维索引对一维数组进行子采样

mysql - MySQL Workbench 中的转储,未知数据库

MySQL RegExp 出现错误 'repetition-operator operand invalid'

c# - 增加这个 try-catch 的可读性?

ios - 减少我的 ios 应用程序大小

jquery - jQuery 代码的优化

MySQL InnoDB 表添加外键 errno :150