Какая линия MySql быстрее: - PullRequest
1 голос
/ 20 апреля 2010

У меня есть переменная classified_id, которая соответствует одному документу в таблице MySql.

В настоящее время я получаю информацию об этой записи:

   SELECT * FROM table WHERE table.classified_id = $classified_id

Интересно, есть ли более быстрый подход, например, такой:

   SELECT 1 FROM table WHERE table.classified_id = $classified_id

Разве последняя не выберет только 1 запись, а это именно то, что мне нужно, чтобы не нужно было сканировать всю таблицу, а вместо этого прекращать поиск записей после того, как найдена 1?

Или мне это снится?

Спасибо

Ответы [ 4 ]

6 голосов
/ 20 апреля 2010

Вы хотите использовать LIMIT:

SELECT * FROM table WHERE table.classified_id = $classified_id LIMIT 1
4 голосов
/ 20 апреля 2010

Да, вы мечтаете об этом.
В ваших рассуждениях есть 2 основных недостатка:

  1. Сам вопрос.Большинство новичков терпят неудачу в этой дыре, хотя.Они спрашивают: «Что, если я что-то сделаю - это будет быстрее?».Но правильный вопрос: «Мое приложение работает медленно. Как найти узкое место?»и «У меня есть определенное узкое место. Как его устранить?»
  2. Вы полагаете, что часть списка полей влияет на поиск в базе данных.Это неверно.Список полей отвечает только за возвращенные поля найденных строк.В обоих случаях количество строк будет одинаковым.
2 голосов
/ 20 апреля 2010

Почему бы вам не попробовать?

SELECT 1 FROM table;

возвращает

+---+
| 1 |
+---+
| 1 | 
| 1 | 
| 1 | 
| 1 | 
| 1 | 
| 1 | 
+---+
6 rows in set (0.00 sec)

, который является вычисляемым столбцом, в данном случае постоянным значением единицы (для всех 6 строк в моем тестовом примере).

На ваш вопрос

SELECT * FROM table WHERE table.classified_id = $classified_id

это самый быстрый способ получения данных (при условии, что вам нужны все столбцы таблицы)

Есть следующие вещи, которые вы можете сделать:

  • проверить, есть ли индекс для классифицированного_идентификатора, есть ли и используется ли индекс быстрее, база данных будет использовать индекс, а не сканировать всю таблицу, поэтому вы получите то, что хотите (использование индекса может быть медленнее, если Есть только несколько записей, или если высокий процент записей удовлетворяет критериям, но наличие индекса не приведет к каким-либо штрафам при чтении данных, база данных выберет лучший способ их получения)
  • если вам не нужны все столбцы таблицы, укажите, какие именно вам нужны
  • если существует более одной записи, удовлетворяющей критериям, вы можете использовать ключевое слово LIMIT, чтобы получить только одну или только несколько записей

кроме этого, для такого простого запроса единственным следующим шагом будет разделение таблицы на несколько жестких дисков (что может быть недоступно в вашей системе).

2 голосов
/ 20 апреля 2010

Вы должны добавить индекс в столбецlass_id, чтобы избежать сканирования таблицы.

CREATE INDEX classified_idx ON table (classified_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...