0

group by と order by を使用するクエリがありますが、非常に遅いです。インデックスを正しく取得するには、助けが必要です。これは私が実行しているクエリです:

select *
    from puresen_mv_shop.cache_deals
where feature_ids REGEXP 'i,t,d'
and phone_cost > 100.00
group by handset_numeric_id
order by popularity
LIMIT 0,10;

説明:

1   SIMPLE  cache_deals index       popularity  5       10  6635320.00  Using where; Using temporary

これは約 3 秒で実行されますが、1 秒未満で必要です。テーブルには 60 万行を超える行があります。テーブル構造は次のとおりです。

mysql> describe cache_deals
        -> ;
    +-------------------------+---------------+------+-----+---------+-------+
    | Field                   | Type          | Null | Key | Default | Extra |
    +-------------------------+---------------+------+-----+---------+-------+
    | deal_id                 | varchar(100)  | NO   |     | NULL    |       |
    | deal_id_replication     | varchar(150)  | NO   | PRI |         |       |
    | handset_numeric_id      | int(10)       | YES  | MUL | NULL    |       |
    | handset_url             | varchar(100)  | YES  |     | NULL    |       |
    | image_url               | varchar(50)   | YES  | MUL | NULL    |       |
    | handset_id              | varchar(50)   | YES  |     | NULL    |       |
    | phone_cost              | decimal(10,2) | YES  |     | NULL    |       |
    | tariff_numeric_id       | int(10)       | YES  | MUL | NULL    |       |
    | tariff_id               | varchar(100)  | YES  | MUL | NULL    |       |
    | tariff_name             | varchar(100)  | YES  |     | NULL    |       |
    | network_name            | varchar(20)   | YES  |     | NULL    |       |
    | network_numeric_id      | int(5)        | YES  | MUL | NULL    |       |
    | term                    | int(5)        | YES  | MUL | NULL    |       |
    | minutes                 | int(5)        | YES  | MUL | NULL    |       |
    | texts                   | int(5)        | YES  | MUL | NULL    |       |
    | data                    | int(5)        | YES  | MUL | NULL    |       |
    | org_line_rental         | decimal(10,2) | YES  | MUL | NULL    |       |
    | effective_monthly_cost  | decimal(10,2) | YES  | MUL | NULL    |       |
    | free_gift_id            | int(10)       | YES  | MUL | NULL    |       |
    | free_gift_name          | varchar(50)   | YES  |     | NULL    |       |
    | cashback                | int(5)        | YES  | MUL | NULL    |       |
    | free_lr                 | int(5)        | YES  | MUL | NULL    |       |
    | half_lr                 | int(5)        | YES  | MUL | NULL    |       |
    | clearance_flag          | int(5)        | YES  | MUL | NULL    |       |
    | manufacturer_numeric_id | int(5)        | YES  | MUL | NULL    |       |
    | manufacturer_name       | varchar(50)   | YES  |     | NULL    |       |
    | full_handset_name       | varchar(100)  | YES  |     | NULL    |       |
    | popularity              | int(20)       | YES  | MUL | NULL    |       |
    | handset_colour          | varchar(50)   | YES  | MUL | NULL    |       |
    | feature_ids             | varchar(100)  | YES  |     | NULL    |       |
    | operating_system        | varchar(30)   | YES  | MUL | NULL    |       |
    +-------------------------+---------------+------+-----+---------+-------+

このテーブルで現在取得しているインデックスは次のとおりです。

mysql> show index from cache_deals;
+-------------+------------+-------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------
| Table       | Non_unique | Key_name                | Seq_in_index | Column_name             | Collation | Cardinality | Sub_part | Packed | Null | Index_type
+-------------+------------+-------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------
| cache_deals |          0 | PRIMARY                 |            1 | deal_id_replication     | A         |      663532 |     NULL | NULL   |      | BTREE
|         |               |
| cache_deals |          1 | handset_numeric_id      |            1 | handset_numeric_id      | A         |         759 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | network_numeric_id      |            1 | network_numeric_id      | A         |           8 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | tariff_numeric_id       |            1 | tariff_numeric_id       | A         |        1091 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | manufacturer_numeric_id |            1 | manufacturer_numeric_id | A         |          23 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | operating_system        |            1 | operating_system        | A         |          42 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | image_url               |            1 | image_url               | A         |         755 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | tariff_id               |            1 | tariff_id           | A         |        1091 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | term                    |            1 | term            | A         |           7 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | minutes                 |            1 | minutes                 | A         |          26 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | texts                   |            1 | texts                   | A         |          14 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | data                    |            1 | data                    | A         |          14 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | org_line_rental         |            1 | org_line_rental         | A         |         128 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | effective_monthly_cost  |            1 | effective_monthly_cost  | A         |        2147 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | free_gift_id            |            1 | free_gift_id            | A         |         105 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | cashback                |            1 | cashback                | A         |           2 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | free_lr                 |            1 | free_lr                 | A         |           2 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | half_lr                 |            1 | half_lr                 | A         |           2 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | clearance_flag          |            1 | clearance_flag          | A         |           2 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | handset_colour          |            1 | handset_colour          | A         |          17 |     NULL | NULL   | YES  | BTREE
|         |               |
| cache_deals |          1 | popularity              |            1 | popularity              | A         |         718 |     NULL | NULL   | YES  | BTREE
|         |               |
+-------------+------------+-------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------

このテーブルに正しくインデックスを付けていますか?

助けてくれてありがとう。

4

2 に答える 2

3

インデックスREGEXPを使用できないため、潜在的なパフォーマンスが低下しています。クエリのその部分を別の方法で記述したり、別のテーブルに正規化したりすることはできますか? できれば、きっと役に立ちます。それ以外は、 と の複合インデックスphone_costhandset_numeric_id役立ちます。そのインデックスに追加することも役立つかもしれませんが、句popularityにない列を実際に操作できるとは想定されていないため、MySQL はクエリにすでに満足していません。GROUP BY

補足として、列のデータ型はより効率的である可能性があります。 の制限により、1 バイト小さいことを除いてint(5)、 と同じように機能します。また、型がそれほど大きくならないので意味がありません。MEDIUMINTINTMEDIUMINTint(20)INT

于 2013-01-07T16:48:21.677 に答える
0
    select [name the columns you actually want returned]
      from puresen_mv_shop.cache_deals
     where feature_ids = 'i,t,d'
       and phone_cost > 100.00
     order 
        by popularity
     LIMIT 0,10;

features_idまたは(features_id、phone_cost)のインデックス

于 2013-01-07T17:30:06.000 に答える