2010-05-20 18 views
5

爲什麼lean_usersref列中顯示NULL?這使我的查詢中使用臨時表,後來一個文件排序(當我增加了更多的連接)...試圖減少mysql查詢,爲什麼'ref'爲NULL?

14:45:21 (60) > EXPLAIN select * from users u inner join lean_users lu on u.id = lu.user_id; 
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra  | 
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 
| 1 | SIMPLE  | lu | index | PRIMARY  | PRIMARY | 4  | NULL   | 358 | Using index | 
| 1 | SIMPLE  | u  | eq_ref | PRIMARY  | PRIMARY | 4  | nwa.lu.user_id | 1 |    | 
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 

用戶表

14:45:24 (61) > show create table users; 
+-------+-----------------------------------------------------------------------------+ 
| Table | Create Table                | 
+-------+-----------------------------------------------------------------------------+ 
| users | CREATE TABLE `users` (
    `id` int(11) NOT NULL auto_increment, 
    `email` varchar(255) default NULL, 
    `first_name` varchar(50) NOT NULL, 
    `last_name` varchar(50) NOT NULL, 
    `address1` varchar(255) NOT NULL, 
    `address2` varchar(255) default NULL, 
    `city` varchar(25) NOT NULL, 
    `state` mediumint(9) default NULL, 
    `zip` varchar(10) NOT NULL, 
    `phone` varchar(20) default NULL, 
    `country` smallint(6) NOT NULL, 
    `username` varchar(10) NOT NULL, 
    `password` varchar(50) default NULL, 
    `cdate` datetime NOT NULL, 
    `last_used` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    `level` varchar(25) default 'user', 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=38076 DEFAULT CHARSET=utf8 | 
+-------+-----------------------------------------------------------------------------+ 

lean_users表

14:45:40 (62) > show create table lean_users; 
+-------------+-----------------------------------------------------------------------------+ 
| Table  | Create Table                | 
+-------------+-----------------------------------------------------------------------------+ 
| lean_users | CREATE TABLE `lean_users` (
    `user_id` int(11) NOT NULL, 
    PRIMARY KEY (`user_id`), 
    CONSTRAINT `lean_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8              | 
+-------------+-----------------------------------------------------------------------------+ 

回答

8

爲什麼lean_users在ref列中顯示NULL?

因爲此表在連接中處於領先地位,並且您不過濾任何索引字段。

這意味着每個記錄都應該被讀取和評估。

+0

有沒有辦法改進它? – ryy 2013-07-30 17:28:00

+0

@ryy:改進什麼? – Quassnoi 2013-07-31 12:28:20

+0

他可以做些什麼不同的事情,所以MySQL不必讀取lean_users的所有索引? – ryy 2013-07-31 14:38:04