私はこれではなく、単純なクエリは、約8秒かかる単純なテーブルにいくつかの単純なインデックスMySQLはGROUP BYのインデックスを使用するかどうかをどのように決定しますか?
Key_name Cardinality
PRIMARY 1510443
piece_to_bin_id 100696
と
stock_ledger_id INT(10) (Primary)
piece_to_bin_id INT(10)
quantity INT(11)
create_datetime TIMESTAMP
... and a few VARCHARs
を持っている:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stock_ledger ALL NULL NULL NULL NULL 1512976 Using temporary; Using filesort
を:
SELECT piece_to_bin_id,
SUM(quantity),
MAX(create_datetime)
FROM stock_ledger
GROUP BY piece_to_bin_id
をここにEXPLAINです
私は私は、インデックスを強制的に約0.5秒にそれをダウンさせることが分かっ:
SELECT piece_to_bin_id,
SUM(quantity),
MAX(create_datetime)
FROM stock_ledger
FORCE INDEX (piece_to_bin_id)
GROUP BY piece_to_bin_id
次に[次のようなルックスをEXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stock_ledger index NULL piece_to_bin_id 4 NULL 1512976
私は、MySQL 5.1.41を使用していますテーブルはMyISAMで、前にANALYZE TABLEを実行しました。
私は「MySQLはもう一度間違ってしまいました。単にインデックスを強制する」とか、MySQLがフルテーブルスキャンを使用する実際の理由はありますか?多分私は修正することができますか?
は、まだ完全なテーブルスキャンを使用していますが、ほぼ同じです。 – ajreal
'SQL_NO_CACHE'命令を使用しても、2番目のクエリは1秒未満で実行されますか? ( 'SELECT SQL_NO_CACHE <残りのクエリ>') –