使用group by with order by时,MYSQL查询速度很慢

时间:2013-01-07 16:37:09

标签: mysql indexing

我有一个使用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秒内运行,但我需要一秒钟。表中有超过600k行。这是表结构:

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
|         |               |
+-------------+------------+-------------------------+--------------+-------------------------+-----------+-------------+----------+--------+------+------------

我是否正确索引此表?

谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

REGEXP正在杀死潜在的表现,因为它无法使用索引。查询的那一部分可以用其他方式编写,还是可以规范化为另一个表?如果可以,那可能会有所帮助。除此之外,phone_costhandset_numeric_id上的综合索引应该有所帮助。将popularity添加到该索引可能有所帮助,但MySQL已经对查询不满意了,因为您并不真的应该能够使用GROUP BY中不包含的列子句。

作为旁注,列的数据类型可能更有效。由于int(5)的限制,MEDIUMINTINT的工作方式相同,只是MEDIUMINT小一个字节。此外,int(20)没有意义,因为INT类型不会那么大。

答案 1 :(得分: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)