一、表結構:
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這個索引,所以隻影響到了一行,優化效果明顯