2013-10-11 3 views
0

У меня есть таблица с 500 000 записей, все, что я хочу сделать, это разместить запрос выбора с помощью шаблона LIKE с использованием лимита, независимо от того, что я делаю, это занимает достаточно много времени показать результат. Это ничего не стоит для меня, как я могу заставить его работать лучше? Мой запрос нижеmysql запрос для длинных записей, достаточно долго, чтобы показать записи

QUERY

if (isset($_GET['res'])) { 
    $value = $_GET['res']; 
    $val = explode(" ", $value); 
     $query = "SELECT productid, productname, retailprice, lmnr, suplier 
       FROM comp where productname = '$value' "; 
     $count = count($val); 
     for ($i = 0; $i < $count; $i++) { 
      $query .= " union Select productid, productname, retailprice, lmnr, suplier 
       from comp where productname like '%" . $val[$i] . "%' "; 
     } 
      $query .=" GROUP BY productid, productname, retailprice, lmnr, suplier LIMIT $start, $limit"; 
} 
$result_query = $db->query($query); 

Любая помощь приветствуется, спасибо

Примечание я сломала этот запрос в союзы, как она используется для поиска цели, я хотите выполнить поиск запросов со всех возможных совпадений строки, разделяющей с помощью SPACES, т. е. A TEST QUERY. Должны быть приняты как «% A%», «% TEST%», «% QUERY%»

+0

[mysql-indexes] (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) – vbrmnd

+0

У вас есть указатель на имя продукта? –

+0

500000 записей с объединением/группой, где с LIKE% ..% с лимитом, это приведет к использованию «Использование временного файла с файловым контуром» с помощью глубоких сканирований (считайте стартовые стартовые значения), и, самое похожее, это создает временную таблицу на основе диска на основе MyISAM (что нужно, сгруппировавшись на диске с помощью quicksort algoritme, что будет медленным с чтением и записью readom i/o), потому что наиболее похоже, что результат не вписывается в память .. EXPLAIN оператор будет EXPLAIN все это ... –

ответ

0

Разговор о безумно сложном запросе. зачем вам все профсоюзы? Каждый запрос, добавляемый в объединение, запускается как его собственный независимый запрос, а затем все результаты объединяются для формирования окончательного набора результатов. Очень болезненный. Почему не

SELECT ... 
WHERE (productname IN ($val1, $val2, $val3, etc....)) 
    OR (productname LIKE '%$val[1]%') 
    OR (productname LIKE '%$val[2]%') 
    OR .... 
    etc... 

все еще очень уродливый, но по крайней мере это всего лишь один запрос SINGLE. И, конечно же, как всегда, мы должны указать, что вы уязвимы для SQL injection attacks, используя устаревшие интерфейсы mysql, blah blah blah ...

0

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

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