MYSQL где поле в утверждении выбора тоже? - PullRequest
1 голос
/ 21 июля 2011

Я хочу вернуть поле name из таблицы базы данных, где id = 4. Какой запрос легче обрабатывать в MYSQL.

SELECT name, id FROM table WHERE id = 4

или

SELECT name FROM table WHERE id = 4

Полагаю,Я спрашиваю, будет ли хорошей практикой помещать поле из оператора WHERE в SELECT, даже если я не верну его в php.

Ответы [ 6 ]

3 голосов
/ 21 июля 2011
SELECT name, id FROM table WHERE id = 4

также будет иметь идентификатор в результате mysql, и это будет очень мало влиять на данные, так как это всего лишь цифра, если вы сделаете это, когда выбираете что-то еще, например 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 голос
/ 21 июля 2011

Если вам не нужен столбец «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)
1 голос
/ 21 июля 2011

Полагаю, я спрашиваю, будет ли хорошей практикой ставить поле из WHERE оператор в SELECT, даже если я не буду возвращать его в php.

Нет. Это увеличит нагрузку на сеть при передаче данных между клиентским сервером. Если вы не собираетесь использовать данные, не выбирайте их.

1 голос
/ 21 июля 2011

Я подозреваю, что второй вариант, более быстрый на большой БД (много записей> 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 голос
/ 21 июля 2011

Нет, это не очень хорошая практика.SELECT именно те поля, которые вам нужны.

1 голос
/ 21 июля 2011

Если вам не нужен возвращенный идентификатор, не включайте его.Если вам это нужно, включите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...