2010-08-05 2 views
3

Выдано 5000 идентификаторов записей в базе данных, какой запрос, на ваш взгляд, быстрее?Оптимизация запросов: какой синтаксис SELECT работает быстрее?

  1. Цикл по 5000 идентификаторов с использованием PHP и выполнить запрос на выборку для каждого из них,

    foreach($ids as $id){ 
        // do the query 
        $r = mysql_query("SELECT * FROM TABLE WHERE ID = {$id}"); 
    } 
    
  2. или собирать все идентификаторы в массиве, и использовать SELECT * из таблицы, где идентификатор (1 вверх 5000)

    //assuming $ids = array(1,2 ---- up to 5000); 
    $r = mysql_query("SELECT * FROM TABLE WHERE ID IN (".join(",",$ids).")"); 
    
+1

испытания Вы это ...? – deceze

+6

Является ли это специфическим для MySQL? Создайте таблицу, заполните ее, а затем измерьте. Данные бьют мнение. – Manfred

+2

@ 0xA3 замечательный комментарий. –

ответ

4

Без тени сомнения, загрузка их всех за один раз будет быстрее. Запуск 5000 запросов будет намного медленнее, так как каждый запрос будет нести определенное количество накладных расходов.

Кроме того, чтобы ускорить его, НЕ используйте оператор *! Выберите поля, которые вы собираетесь использовать, если вам нужен только столбец идентификатора, укажите это! Если вам нужны все столбцы, укажите их все, потому что позже вы можете добавлять поля, и вам не нужно извлекать это новое поле.

+2

+1 Но будьте осторожны с длиной построенной строки запроса. с конструкцией «IN» вы можете достичь максимальной длины. Кроме того, объединение $ ids подвержено уязвимости SQL-инъекции. Попробуйте использовать mysql_real_escape_string() для каждого идентификатора. – ThinkJet

4

вариант 2, безусловно, будет быстрее. 5000 отдельных запросов db будут иметь огромные издержки на подключение к сети.

0

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

2

Самый быстрый способ - не запрашивать 5000 строк.
Вам едва нужно 100, чтобы отображать их на одной странице. 5000 - это перебор избытка

+1

Полностью зависит от цели страницы, на самом деле это не ответ. –

0

Loop быстрее, если вы используете заявление о запросе с использованием переменных привязки. Объявить заявление из цикла; то внутри цикла свяжите переменную на каждый идентификатор.

Не стоит недооценивать время, затрачиваемое на разбор SQL; особенно на этих длинных ветреных вещах.

0

Вариант 2 работает быстрее. С помощью опции 1 вы выполняете полный roundtrim для сервера для каждой итерации.

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

Подсказка: Измерение, измерение, измерение. С кодом, который стоит 10 минут вашего времени, вы сразу получите ответ.

0

Что быстрее для многих запросов?
Попробуйте измерить, например, как это:

<?php 
    $start = getmicrotime(); 
    for ($i=0;$i<100000;$i++) 
    { 
      foreach($ids as $id){ 
       // do the query 
       $r = mysql_query("SELECT * FROM TABLE WHERE ID = {$id}"); 
      } 

    } 
    $end = getmicrotime(); 
    echo 'Time (1): '.($end- $start).' sec'; 



    $start = getmicrotime(); 
    for ($i=0;$i<100000;$i++) 
    { 
      //assuming $ids = array(1,2 ---- up to 5000); 
      $r = mysql_query("SELECT * FROM TABLE WHERE ID IN (".join(",",$ids).")"); 
    } 
    $end = getmicrotime(); 
    echo 'Time (2): '.($end- $start).' sec'; 
?> 
+0

ваши тесты хороши ни для чего –

Смежные вопросы