2011-07-21 32 views
1

我想從id = 4的數據庫表中返回字段name。MYSQL處理哪個查詢更容易。MYSQL在選擇語句中的字段呢?

SELECT name, id FROM table WHERE id = 4 

SELECT name FROM table WHERE id = 4 

我想我要問,如果它是很好的做法,把字段從WHERE聲明SELECT以及即使我不會在PHP返回。

+1

只選擇字段,你需要你節省內存佔用所產生的設置 – Igor

+0

獲取和攜帶有害的東西是不是一個好的做法 – zod

回答

3
SELECT name, id FROM table WHERE id = 4 

也有從MySQL結果的ID,如果你這樣做,你正在選擇其他的東西,這將使相差無幾的數據,因爲它僅僅是一個數字然而作爲SELECT name, id FROM table WHERE name = "ron"肯定會是一個不好的做法,因爲更多數據正在從數據庫服務器傳輸,因爲您已經知道名稱「ron」,並且因爲它不是唯一的,所以它可能有多個行。

mysql> explain select id,name from admin_users where id = 1; 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | admin_users | const | PRIMARY  | PRIMARY | 4  | const | 1 |  | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
1 row in set (0.00 sec) 

mysql> explain select name from admin_users where id = 1; 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | admin_users | const | PRIMARY  | PRIMARY | 4  | const | 1 |  | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
1 row in set (0.00 sec) 

相比

mysql> explain select id,name from admin_users where name = 'ron'; 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | admin_users | const | PRIMARY  | PRIMARY | 4  | const | 1 |  | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
123 row in set (0.11 sec) 

mysql> explain select name from admin_users where name = 'ron'; 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | admin_users | const | PRIMARY  | PRIMARY | 4  | const | 1 |  | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
123 row in set (0.05 sec) 
1

如果您不需要返回的ID,請不要包含它。如果你需要它,請包括它。

1

不,這不是很好的做法。 SELECT恰恰是你需要的那些領域。

1

我懷疑第二個選擇,在大數據庫(許多記錄> 1M)上更快,因爲從數據庫中提取數據所需的時間更少。


這裏是一個小桌子(1187條記錄)做了分析,ID是一個主鍵:

mysql> select name,id from websites where id = 1; 
+------+----+ 
| name | id | 
+------+----+ 
| Shef | 1 | 
+------+----+ 
1 row in set (0.00 sec) 

mysql> select name from websites where id = 1; 
+------+ 
| name | 
+------+ 
| Shef | 
+------+ 
1 row in set (0.00 sec) 

對於第一個查詢:

+----------------------+----------+ 
| Status    | Duration | 
+----------------------+----------+ 
| starting    | 0.000045 | 
| checking permissions | 0.000006 | 
| Opening tables  | 0.000016 | 
| System lock   | 0.000007 | 
| init     | 0.000016 | 
| optimizing   | 0.000006 | 
| statistics   | 0.000063 | 
| preparing   | 0.000008 | 
| executing   | 0.000004 | 
| Sending data   | 0.000009 | 
| end     | 0.000003 | 
| query end   | 0.000002 | 
| closing tables  | 0.000005 | 
| freeing items  | 0.000046 | 
| logging slow query | 0.000002 | 
| cleaning up   | 0.000002 | 
+----------------------+----------+ 

對於第二個查詢:

+----------------------+----------+ 
| Status    | Duration | 
+----------------------+----------+ 
| starting    | 0.000050 | 
| checking permissions | 0.000006 | 
| Opening tables  | 0.000015 | 
| System lock   | 0.000008 | 
| init     | 0.000017 | 
| optimizing   | 0.000008 | 
| statistics   | 0.000044 | 
| preparing   | 0.000008 | 
| executing   | 0.000002 | 
| Sending data   | 0.000009 | 
| end     | 0.000003 | 
| query end   | 0.000002 | 
| closing tables  | 0.000005 | 
| freeing items  | 0.000046 | 
| logging slow query | 0.000002 | 
| cleaning up   | 0.000002 | 
+----------------------+----------+ 
1

我想我是問是否很好的做法是將SELECT語句中的 WHERE語句中的字段放入,即使我不會在PHP中返回它。

沒有。這會在客戶端服務器之間傳輸數據時增加網絡開銷。如果您不打算使用這些數據,請不要選擇它。

1

除非您在結果中需要'id'列,否則沒有理由要求它。 MySQL會將查詢視爲相同。詢問它可能會減慢速度,因爲MySQL必須將額外的數據返回給您,並且您的程序需要解析它。懷疑這對'id'欄很重要,但如果它是幾個巨大的文本字段,它可能會。

以下是MySQL對我的簡單表上的兩個查詢(在id字段中有一個索引)的看法。

mysql> explain select id,name from admin_users where id = 1; 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | admin_users | const | PRIMARY  | PRIMARY | 4  | const | 1 |  | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
1 row in set (0.00 sec) 

mysql> explain select name from admin_users where id = 1; 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | admin_users | const | PRIMARY  | PRIMARY | 4  | const | 1 |  | 
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+ 
1 row in set (0.00 sec) 
+0

哇,速度 – CyberJunkie

+0

那麼沒有什麼區別,取決於'admin_users'表的記錄數是多少,但如果你做了詳細的分析,你肯定會看到微秒的差異。 – Shef

+1

小心。 (0.00秒)是指MySQL生成查詢計劃所用的時間......而不是返回結果所花費的時間。 –