3

インデックス付きの列で単純なクエリを実行していますが、500 ミリ秒以上かかります。これらのクエリは頻繁に実行されるため、パフォーマンスに大きな影響を与えています。

テーブル内の 100 万行弱の非常に単純なテーブル。MyISAM を使用します。すべての行を調べている理由がわかりません。インデックスを無視しているようです! フィールドに 2 番目のインデックスを追加しようとしましたが、一意のインデックスではなく通常のインデックスでしたが、違いはありませんでした。ご覧いただきありがとうございます。

# Time: 130730 22:00:07
# User@Host: engine[engine] @ engine [10.0.0.6]
# Query_time: 0.511209  Lock_time: 0.000050 Rows_sent: 1  Rows_examined: 932048
SET timestamp=1375236007;
SELECT * FROM `marketplacesales`.`sales_order` WHERE `marketplace_orderid` = 823123693003;

+---------------------+-----------------------+------+-----+---------+----------------+
| Field               | Type                  | Null | Key | Default | Extra          |
+---------------------+-----------------------+------+-----+---------+----------------+
| id                  | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
| marketplace_id      | smallint(5) unsigned  | NO   | MUL | NULL    |                |
| marketplace_orderid | varchar(255)          | NO   | UNI | NULL    |                |
| datetime            | datetime              | NO   |     | NULL    |                |
| added               | datetime              | NO   | MUL | NULL    |                |
| phone               | varchar(255)          | YES  |     | NULL    |                |
| email               | varchar(255)          | YES  |     | NULL    |                |
| company             | varchar(255)          | NO   |     | NULL    |                |
| name                | varchar(255)          | NO   |     | NULL    |                |
| address1            | varchar(255)          | NO   |     | NULL    |                |
| address2            | varchar(255)          | NO   |     | NULL    |                |
| city                | varchar(255)          | NO   |     | NULL    |                |
| state               | varchar(255)          | NO   |     | NULL    |                |
| zip                 | varchar(255)          | NO   |     | NULL    |                |
| country             | varchar(255)          | NO   |     | NULL    |                |
+---------------------+-----------------------+------+-----+---------+----------------+

EXPLAIN SELECT * FROM `marketplacesales`.`sales_order` WHERE `marketplace_orderid` = 823123693003;
+----+-------------+-------------+------+-------------------------------------------+------+---------+------+--------+-------------+
| id | select_type | table       | type | possible_keys                             | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------------+------+-------------------------------------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | sales_order | ALL  | marketplace_orderid,marketplace_orderid_2 | NULL | NULL    | NULL | 932053 | Using where |
+----+-------------+-------------+------+-------------------------------------------+------+---------+------+--------+-------------+
1 row in set (0.00 sec)
4

2 に答える 2

6

何が起こっているのかを確認するには、explain を使用する必要があります。私の推測では、インデックスは使用されていません

where条項は次のとおりです。

WHERE `marketplace_orderid` = 823123693003;

hereで説明されているように、変換は浮動小数点数として行われます。これには での変換が必要marketplace_orderidです。

テーブル内のフィールドを数値に修正してください。または、where句で値を引用符で囲みます。

WHERE `marketplace_orderid` = '823123693003';

引用符の問題は、実際の値の先頭にゼロが含まれている可能性があり、一致が失敗する可能性があることです。

于 2013-07-31T02:16:49.643 に答える
0

使用してみてください:

SELECT * FROM `marketplacesales`.`sales_order` WHERE `marketplace_orderid LIKE '823123693003%'

これにより、インデックスの使用が強制されます。

また、可能であれば、フィールドをvarcharではなくbigintに変更することを検討します

于 2013-07-31T02:14:38.633 に答える