1

我的表有 1,000,000 行和 4 列:

id  cont    stat   message

1   rgrf       0   ttgthyhtg
2   frrgt      0   tthyrt
3   4r44       1   rrttttg
...

我正在执行一个非常慢的选择查询,即使我已经完成了索引

  SELECT * FROM tablea WHERE stat='0' order by id LIMIT 1

这个查询让我mysql很慢,我用 mysql explain 查了一下,发现这个

  explain SELECT * FROM tablea WHERE stat='0' order by id LIMIT 1

我对输出感到震惊,但我不知道如何优化它。

id  select_type  table   type  possible_keys  key  key_len  ref      rows  Extra
 1  SIMPLE       tablea  ref   stat           stat       4  const  216404  Using where

有 216,404 行需要优化,我必须减少到 1 或 2,但如何?

4

2 回答 2

0

我建议您尝试在 (stat, id) 上创建复合索引。这可能使您的搜索/订单操作得到优化。当然,有一个缺点:插入和更新会产生额外的开销。

CREATE INDEX ON tablea (stat,id) USING BTREE

试试看。

于 2012-11-22T16:49:12.570 回答
0

问题是 MySQL 在查询中每个表只能使用一个索引,stat在您的情况下这是索引。因此,在ORDER BY不使用索引的情况下执行,这在 1M 行上非常慢。尝试以下操作:

  • 隐式使用正确的索引: SELECT * FROM tablea USE INDEX(PRIMARY) WHERE stat='0' order by id LIMIT 1

  • 创建一个复合索引,就像上面所说的 Ollie Jones 一样。

于 2012-11-22T16:53:44.417 回答