mysql查詢優化小發現

一、表結構:


mysql> desc lee;
+-------+------------+------+-----+---------+----------------+
| Field | Type       | Null | Key | Default | Extra          |
+-------+------------+------+-----+---------+----------------+
| id    | int(11)    | NO   | PRI | NULL    | auto_increment |
| name  | varchar(5) | YES  |     | NULL    |                |
+-------+------------+------+-----+---------+----------------+
                                                                       
mysql> show create table lee;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                  |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| lee   | CREATE TABLE `lee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=909 DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


二、查詢要求: 查詢最小id的角色的所有信息


三、看到這個要求最先想到的就是這樣的一句話 :


select min(id),name from lee;

看看實際效果

mysql> explain select min(id) ,name from lee;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | lee   | ALL  | NULL          | NULL | NULL    | NULL |  903 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+


影響到 903行,因爲沒有用到索引,查詢代價高


四、如果我們只是查詢min(id)看看實際執行效果就可以看到如下信息:


mysql> explain select min(id) from lee;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+


   官方文檔給的解釋的 如COUNT(), MIN(), MAX() 這類的方法並且是用於索引列的話,mysql是提供優化。例如MIN來查詢某一列的最小值,只需要查詢對應B-Tree索引最左端的記錄,Mysql可以直接獲取索引的第一行記錄。在優化器生成執行計劃的時候就可以利用這一點,在B-Tree索引中,優化器會將這個表達式作爲一個常數對待。


   那麼上述的要求就可以用如下的語句來實現


select * from lee where id = (select min(id) from lee);


   使用一個select嵌套並用id索引列來實現

   看看實際效果

mysql> explain select * from lee where id = (select min(id) from lee);
+----+-------------+-------+-------+---------------+---------+---------+-------+------+------------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra                        |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+------------------------------+
|  1 | PRIMARY     | lee   | const | PRIMARY       | PRIMARY | 4       | const |    1 |                              |
|  2 | SUBQUERY    | NULL  | NULL  | NULL          | NULL    | NULL    | NULL  | NULL | Select tables optimized away |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+------------------------------+


   因爲用到了id這個索引,所以隻影響到了一行,優化效果明顯


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章