php - MYSQL where 子句在大表上性能降低

标签 php mysql performance

我在使用大表时遇到性能问题

我使用这个在列上添加索引:

 ALTER table add index column;

在文本/blob 列上:

alter table  add index (cat(200));

我的表有大约 6M 行,我正在使用 InnoDB 引擎 (Mysql 5.5)

现在我在“order by”列上添加索引,这个查询非常快:

  SELECT * from table order by column DESC LIMIT 0,40

但是当我在此查询上添加 WHERE 子句时,它的速度非常慢,即使使用上面的“cat”列索引,也需要大约 10 秒才能加载。 //索引而不是索引

 SELECT * from table WHERE cat = 'electronic' order by column DESC LIMIT 0,40

这个慢查询的解释:

  EXPLAIN SELECT * from table WHERE cat = 'electronic' order by 'id' DESC LIMIT 0,40

ID:1 选择类型:简单 表:产品 类型:引用 可能的键:猫 关键:猫 key 长度:203 引用:常量 行:1732184 额外:使用where

查询对于具有 50k 行的小表工作正常,但对于 6M 行则速度较慢。为什么?

最佳答案

不要使用前缀,例如 cat(200) ;它通常会使索引变得不可用。我从未见过优化器在面对INDEX(a(10), b)时的情况,过去a并利用b .

更改cat成为VARCHAR(255) 。这对于“类别”来说可能绰绰有余。

最好的索引(如果可能的话)是

INDEX(cat, `column`)

请注意cat位于 WHERE= 。它处理整个WHERE ,因此索引可以移至 ORDER BY 。因此column也可以使用。 More discussion of index making .

如果cat必须是TEXT ,那么你能做的最好的就是

INDEX(`column`)

然后优化器可能决定使用它来避免文件排序。但是,如果“电子”行少于 40 个(请参阅 LIMIT),则需要进行大量扫描,并且可能比不使用索引慢。所以,我不确定它是否值得拥有 INDEX(column) .

关于php - MYSQL where 子句在大表上性能降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45261410/

相关文章:

PHP & ZF2/比较 : expected == actual

php - 用单个字符替换所有非数字字符

mysql - Play 2.3 JPA Hibernate MySQL 池/连接错误

mysql 回退 WHERE 语句

performance - 由于 libc,Node.js 在 Ubuntu 12.04.3 上的性能较低

sql-server - 当拥有身份列不是一个好主意时?

php - 跨浏览器 : File Upload Issue (HTML+PHP) - NOT TO UPLOAD IMMEDIATELY

php - 使用 jQuery 添加从 Doctype 到 iframe 的完整 HTML

php - 从学说和 native mysql 查询中获取最后插入的 ID

mysql - 重命名MySQL中所有表名的部分