Mysql的一條SQL最佳化(二),mysql一條sql最佳化

來源:互聯網
上載者:User

Mysql的一條SQL最佳化(二),mysql一條sql最佳化
開發過來查看我做的調整,發現我建立的索引其實在另一個測試庫上(測試庫2)已經建立好了,但為什麼測試庫2上還是慢呢?
於是上測試庫2查看,發現之前我建立的2個列的索引確實已經有了,並且還多了一個索引i_msource_type:
Indexes ColumnsIndex_Type
PRIMARY ext_idUnique
i_mobile mobile
i_msource_type msource_type
i_msource_id msource_id
而msource_type列的可選擇性是非常低了,基本上到這裡我大概知道是怎麼回事了,剩下的事情就是驗證我的猜測,explain:
mysql> explain select            ext_id, mid, msource_id, msource_type, referee, mobile, tel, mpassword,status         from m_vip_ext     where  (msource_id='xx1391434680574433' and msource_type=1 )     or ( mobile='1391434680574433'   and msource_type=1);
+----+-------------+-----------+------+--------------------------------------+----------------+---------+-------+-------+-------------+
| id | select_type | table     | type | possible_keys                        | key            | key_len | ref   | rows  | Extra       |
+----+-------------+-----------+------+--------------------------------------+----------------+---------+-------+-------+-------------+
|  1 | SIMPLE      | m_vip_ext | ref  | i_mobile,i_msource_type,i_msource_id | i_msource_type | 4       | const | 58383 | Using where |
+----+-------------+-----------+------+--------------------------------------+----------------+---------+-------+-------+-------------+
1 row in set (0.17 sec)
果不其然,Mysql的最佳化器並沒有選擇之前的2個索引,而是選擇了可選擇性很低的i_msource_type,這無疑是比全表掃描效率更低的一種方式。
果斷drop掉索引:
mysql> alter table m_vip_ext drop index i_msource_type;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
再次explain:
mysql> explain select            ext_id, mid, msource_id, msource_type, referee, mobile, tel, mpassword,status         from m_vip_ext     where  (msource_id='xx1391434680574433' and msource_type=1 )     or ( mobile='1391434680574433'   and msource_type=1);
+----+-------------+-----------+-------------+-----------------------+-----------------------+---------+------+------+------------------------------------------------------+
| id | select_type | table     | type        | possible_keys         | key                   | key_len | ref  | rows | Extra                                                |
+----+-------------+-----------+-------------+-----------------------+-----------------------+---------+------+------+------------------------------------------------------+
|  1 | SIMPLE      | m_vip_ext | index_merge | i_mobile,i_msource_id | i_msource_id,i_mobile | 98,99   | NULL |    2 | Using sort_union(i_msource_id,i_mobile); Using where |
+----+-------------+-----------+-------------+-----------------------+-----------------------+---------+------+------+------------------------------------------------------+
1 row in set (0.17 sec)
mysql> explain select            ext_id, mid, msource_id, msource_type, referee, mobile, tel, mpassword,status         from m_vip_ext     where  (msource_id='xx1391434680574433' and msource_type=1 )     or ( mobile='1391434680574433'   and msource_type=1) \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: m_vip_ext
         type: index_merge
possible_keys: i_mobile,i_msource_id
          key: i_msource_id,i_mobile
      key_len: 98,99
          ref: NULL
         rows: 2
        Extra: Using sort_union(i_msource_id,i_mobile); Using where
1 row in set (0.00 sec)


ERROR: 
No query specified
mysql> show status like '%cost%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| Last_query_cost | 7.328006 |
+-----------------+----------+
1 row in set (0.00 sec)
OK了,開發人員用測試庫2做的壓測,反映並發也能上1000了。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.