我想從id = 4的數據庫表中返回字段name
。MYSQL處理哪個查詢更容易。MYSQL在選擇語句中的字段呢?
SELECT name, id FROM table WHERE id = 4
或
SELECT name FROM table WHERE id = 4
我想我要問,如果它是很好的做法,把字段從WHERE
聲明SELECT
以及即使我不會在PHP返回。
我想從id = 4的數據庫表中返回字段name
。MYSQL處理哪個查詢更容易。MYSQL在選擇語句中的字段呢?
SELECT name, id FROM table WHERE id = 4
或
SELECT name FROM table WHERE id = 4
我想我要問,如果它是很好的做法,把字段從WHERE
聲明SELECT
以及即使我不會在PHP返回。
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)
如果您不需要返回的ID,請不要包含它。如果你需要它,請包括它。
不,這不是很好的做法。 SELECT
恰恰是你需要的那些領域。
我懷疑第二個選擇,在大數據庫(許多記錄> 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 |
+----------------------+----------+
我想我是問是否很好的做法是將SELECT語句中的 WHERE語句中的字段放入,即使我不會在PHP中返回它。
沒有。這會在客戶端服務器之間傳輸數據時增加網絡開銷。如果您不打算使用這些數據,請不要選擇它。
除非您在結果中需要'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)
哇,速度 – CyberJunkie
那麼沒有什麼區別,取決於'admin_users'表的記錄數是多少,但如果你做了詳細的分析,你肯定會看到微秒的差異。 – Shef
小心。 (0.00秒)是指MySQL生成查詢計劃所用的時間......而不是返回結果所花費的時間。 –
只選擇字段,你需要你節省內存佔用所產生的設置 – Igor
獲取和攜帶有害的東西是不是一個好的做法 – zod