MySQL: выполняет ли поиск запрос во всей таблице? - PullRequest
2 голосов
/ 02 сентября 2010

1. Поэтому, если я ищу слово ball в таблице toys, где у меня есть 5.000.000 записей, будет ли оно искать все 5 миллионов?

Iдумаю, что ответ «да», потому что как он должен знать иначе, но, пожалуйста, дайте мне знать, пожалуйста.запросить только один раз и работать с результатами?

Пример

У меня есть такая структура таблицы, например:

id |toy_name |state

Теперь я должен запросить вот так

mysql_query("SELECT * FROM toys WHERE STATE = 1");

Но не логичнее запросить всю таблицу mysql_query("SELECT * FROM toys");, а затем сделать это if($query['state'] == 1)?

3. И еще что-то, если я добавлю ORDER BY id LIMIT 5 в mysql_query, будет ли он искать 5 миллионов записей или только последние 5?

Спасибо за ответы.

Ответы [ 3 ]

3 голосов
/ 02 сентября 2010
  1. Да, если у вас нет предложения LIMIT, он просматривает все строки.Он будет выполнять сканирование таблицы, если он не может использовать index .

  2. Вы должны использовать запрос с предложением WHERE здесь, а не фильтровать результаты в PHP,Ваша СУБД предназначена для эффективного выполнения подобных задач.Только когда вам нужно выполнить сложную обработку данных, более целесообразно загрузить набор результатов в PHP и сделать это там.

  3. С LIMIT 5 СУБД будет просматриватьстол, пока он не найдет вам ваши пять рядов, и тогда он перестанет смотреть.Итак, все, что я могу сказать наверняка, это то, что он будет рассматривать от 5 до 5 миллионов строк!

2 голосов
/ 02 сентября 2010

Читайте об индексах: -)

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Это делает его очень быстрым: -)

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

А для # 2 - это медленно, потому что скорость передачи из MySQL -> PHP медленная, а MySQL НАМНОГО быстрее при выполнении фильтрации.

1 голос
/ 03 сентября 2010

Для вашего вопроса № 1: Зависит от того, как вы ищете «мяч». Если в столбце (столбцах), в котором вы ведете поиск, нет индекса, тогда должна быть прочитана вся таблица. Если есть индекс, то ...

  1. WHERE field LIKE 'ball%' будет использовать индекс
  2. WHERE field LIKE '%ball%' будет НЕ использовать индекс

Для вашего # 2, подумайте об этом следующим образом: Выполнение SELECT * FROM table и последующее изучение результатов в вашем приложении - это то же самое, что пойти в местный супер Walmart, загрузить полный инвентарь магазина в вашу машину и отвезти его домой. , выбирая каждую коробку / упаковку, и выбрасывая все, кроме пачки жевательной резинки из стойки для импульсной покупки, до тех пор, пока вы не захотели сначала. Весь смысл базы данных состоит в том, чтобы упростить поиск данных и их фильтрацию по любому виду предложения, о котором вы только могли подумать. Перетаскивая все в ваше приложение и выполняя там фильтрацию, вы сократили эту блестящую базу данных до очень дорогого дискового интерфейса, и, вероятно, было бы лучше хранить вещи в плоских файлах. Вот почему есть предложения WHERE. «ВЫБЕРИТЕ что-нибудь из магазина ГДЕ type = pack_of_gum» дает вам только жвачку и не заставляет вас отвезти домой несколько тысяч бутылок шампуня и мешки с кошачьим мусором.

Для вашего # 3, да. Если в запросе LIMIT есть предложение ORDER BY, результирующий набор должен быть отсортирован, прежде чем база данных сможет выяснить, какими должны быть эти 5 записей. Хотя это не так плохо, как фактическая передача всего набора записей в ваше приложение и выбор только первых пяти записей, он все же включает в себя немного больше работы, чем просто получение первых 5 записей, соответствующих предложению WHERE.

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