2013-02-10 6 views
1

Моя проблема заключается в следующем: У меня есть два массива $first и $second той же длины, содержащей строки. Каждая строка задается положительное значение в таблице с именем Fullhandvalues:String to Value compare Оптимизация MySQL Query

Field: board : string(7) PRIMARY KEY 
Field: value : int (11) 

Я хочу подсчитать, сколько раз $ первый [$ я] имеет лучшее значение, чем $ второго [$ я], сколько раз у них есть то же значение и сколько раз $ first [$ i] имеет худшее значение, чем $ second [$ i].

То, что я сделал в настоящее время получает все значения с помощью

$values[0]= DB::table('Fullhandvalues')->where_in("board",$first)->get(Array("value")); 
$values[1]= DB::table('Fullhandvalues')->where_in("board",$second)->get(Array("value")); 

, а затем сравнивая значения. Но это, кажется, очень медленно (примерно 6 секунд, при длине массива 5000 и 50000 записей в таблице)

Большое спасибо заранее

EDIT: Как я цикл через них:

$win=0;$lose=0;$tie=0; 
for($i=0;$i<count($values[0]);$i++) 
    { 
     if ($values[0][$i]>$values[1][$i]) 
      $win++; 
     elseif ($values[0][$i]<$values[1][$i]) 
      $lose++; 
     else $tie++; 
    } 
+0

Обозначены ли ваши столбцы? – David

+0

Да, на борту есть указатель – edi9999

+0

Извините, я вижу индекс сейчас. Можете ли вы опубликовать, как вы проходите через них? – David

ответ

1

Ваша проблема where_in. Вы в основном строите запрос длиной implode(',', $second) (плюс изменение). Это должно быть сначала создано Laravel (PHP), а затем проанализировано вашей СУБД.

Также сгенерированный запрос будет использовать выражение IN(...), которое, как известно, медленное в MySQL.

Без дополнительной информации о программе и как идентификаторы доски выбраны, здесь вариант у вас есть:

  • Создать ТЕМП-таблицу и заполнить ее с данными массива (это должно быть довольно быстро, но желательно, чтобы эти данные уже были в базе данных)
  • Не забудьте создать индекс в таблице темпа.
  • Выбрать с внутренней join.
+0

Если я хочу ВСТАВИТЬ данные '$ first' и' $ second', мне тоже придется их развязать, и БД тоже придется анализировать все? Я не вижу разницы. – edi9999

+0

Я хотел бы видеть ваши доказательства того, что IN (...) медленнее в MySQL, он выполняет любой альтернативный синтаксис SQL для этого типа вещей (например, несколько OR), как видно: http://stackoverflow.com/ вопросы/782915/mysql-or-vs-in-performance и – David

+0

@ David It *** *** медленно, если вам нужны доказательства, просто спросите Google или посмотрите на увеличение производительности QA, которое снизило продолжительность запроса на 95 %, хотя он выбрал в 10 раз больше строк. И я предложил более быстрое решение, которое объединяется и которое находится в моем ответе. – dualed