Есть ли разница между именем столбца, например "%%", и никаким условием? - PullRequest
0 голосов
/ 24 февраля 2011

Есть ли разница в этих 2 запросах (с точки зрения оптимизации)?

select * from users;

и

select * from users where first_name like '%%' and last_name like '%%'

Я строю запрос в PHP динамически, используя переданные параметры.Так, например ..

$first_name_str = "";
if($firstname)
{
    $first_name_str = "first_name = '%".$firstname."%' and";
}

$last_name_str = "";
if($lastname)
{
    $last_name_str = "last_name = '%".$lastname."%' and";
}


$query = 
"select
        *

from    
    users

where
    ".$first_name_str."
    ".$last_name_str."
    1=1";

Причина, по которой я спрашиваю это, состоит в том, что я прочитал, что mysql использует только один индекс при выполнении выбора.Итак, если у меня есть отдельные индексы по имени и фамилии, будет использоваться только один.В случае, если у меня есть запрос как:

select * from users where first_name like '%%' and last_name like '%%'

по умолчанию, я могу добавить объединенный индекс как для имени, так и для фамилии, и поиск будет намного быстрее?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2011

Like '%' совпадает с Like '%%' или Like '%%%' или LIKE '%%%%'.

Чтобы проверить это самостоятельно, просто запустите объяснение в запросе.Вот несколько примеров запросов, которые я выполнял на своей таблице.

mysql> explain select * from USERS where EMAIL like '%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | USERS | ALL  | NULL          | NULL | NULL    | NULL |  415 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.02 sec)

mysql> explain select * from USERS where EMAIL like '%%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | USERS | ALL  | NULL          | NULL | NULL    | NULL |  415 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select * from USERS where EMAIL like '%%%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | USERS | ALL  | NULL          | NULL | NULL    | NULL |  415 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.01 sec)

2 пункта @Iain - верный путь к производительности.Но попробуйте найти большинство проблем с производительностью при постановке с использованием нагрузочного тестирования.

0 голосов
/ 24 февраля 2011

// РЕДАКТИРОВАТЬ: прочитал первую строку вашего вопроса до поздна, поэтому я пропустил часть "мудрый оптимизация" ... Теперь мой ответ немного не по теме, но не совсем не так, поэтому я не собираюсь удалить его. Может быть, кто-то найдет это полезным в любом случае ...

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

Но есть еще один важный момент, который может или не может вам помешать, зависит от настроек вашего стола:

LIKE сравнение с NULL всегда дает NULL, поэтому, если в вашей таблице есть строки, в которых last_name или first_name имеют значение NULL, то WHERE <field> LIKE '%' (или '%%' или '%%%') не будет вернуть эту строку (потому что NULL LIKE '%' возвращает NULL, что явно не TRUE).

0 голосов
/ 24 февраля 2011

Большинство серверов SQL (и я думаю, что MySql - один из них) делают все возможное, чтобы хорошо использовать индексы с ключевым словом LIKE.

Использование LIKE '%' должно выполняться так же быстро, как и условия для большинства запросов.Я не уверен насчет LIKE '%%'

Но в целом при оптимизации производительности следует помнить две важные вещи:

  1. Не беспокойтесь, если это не проблема
  2. Если требуется оптимизация, измерьте ее (инструменты трассировки, профилировщики и т. Д.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...