MySQL索引最佳性能

标签 mysql indexing

我正在为我的高流量网站优化一个 mysql 表,我有一个关于 mysql 索引的问题。首先是一些信息:

该表有 273382 行。

查询是:

SELECT table1.field1, table1.field2, table2.field2
FROM table1
LEFT JOIN table2 ON table1.idfield = table2.idfield
WHERE table1.field = 1 AND table1.field2 = 'yes'
ORDER BY table1.id DESC
LIMIT 0,25

我有以下索引:

index for table1.id - primary unique index
index for table1.idfield - index
index for table2.idfield - index
index for (table1.field,table1.field2) - index

使用上述索引查询需要 1.5 到 2.5 秒才能完成

EXPLAIN EXTENDED 说它正在使用主键 (table1.id),我已经尝试过 unique/index (table1.field,table1.field2,table1.id) 并得到类似的结果(即使它正在使用这个索引) .

在索引更改过程中(大约需要 1 分钟),查询变得更快 0.009。更改过程完成后,查询速度将恢复为 1.5-2.5 秒(大部分低于 2 秒)。

我的问题是:哪个索引最适合此查询以及为什么在更改索引时查询速度如此之快。

最佳答案

如果超过大约 20% 的表具有 table1.field = 1 AND table1.field2 = 'yes',则优化器决定扫描表而不是反弹更便宜甚至在最佳索引 (field, field2, id) 和数据之间来回。

请提供SHOW CREATE TABLESHOW TABLE STATUSEXPLAIN SELECT ...、RAM 大小和innodb_buffer_pool_size 如果您想进一步讨论这个问题。

它闻起来像缓存和 I/O 问题;以上信息将有助于深入了解这一点。

关于MySQL索引最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387785/

相关文章:

mysql - 如何获取两个不同表的两列,其中 id = id 和 id= 9?

mysql - 如何在 MySQL 中使用 ALTER 将 VARCHAR 类型更改为 DATETIME?

mysql utf8mb4_unicode_ci 导致唯一键冲突

php - 从 Controller 中的查询结果中获取值

r - 你会如何在 R 中完成这个棘手的子集化?

sql - 使用非聚集索引时,我的 SQL 查询花费的时间太长

Python:连接pandas多索引

python - ElasticSearch大量索引导致OOM

php - 如何使用 MySQL 中保留的键和其他结构特征复制表?

尽管被比较的值在逻辑上被验证为 true,但 PHP-if 语句未评估为 true