Повышение производительности запроса с помощью оператора Like - PullRequest
0 голосов
/ 02 мая 2018

Я использую поисковый запрос для поиска skus в моей БД, и у меня плохая производительность, возвращаемая из отчета TrueSight.

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

мой запрос:

public SkuQuery(final DataSource ds) {
    super(ds, "SELECT sku, description1, buyer, analyst FROM descrip WHERE item_status != 3 AND sku like ? ");
    declareParameter(new SqlParameter(Types.VARCHAR));
    compile();
}

Из-за оператора sku like при каждом запуске он может создать полную таблицу из 420 000 строк. Если переписать это, чтобы выполнить точный поиск в sku, который является первичным ключом, он запускается за 0,016 секунды.

Я использую шаблон "sku like '% 5052024%';"

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Используйте запрос как

super(ds, "SELECT sku, description1, buyer, analyst FROM descrip WHERE item_status != 3");

В java-коде, после получения данных в sku, выполните цикл по нему, проверяя, как

while([RESULT_SET-CONDITION]){
    if(sku.contains(5052024)){
        //Your Code
    }
}

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

0 голосов
/ 02 мая 2018

Из вашего вопроса не ясно, можете ли вы использовать = вместо LIKE. От пользователей не требуется вводить весь номер SKU?

Невозможно улучшить производительность LIKE, когда в начале вашего шаблона есть подстановочный знак.

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

Вот так подстановочные знаки работают в LIKE условиях. Если ваш шаблон не имеет подстановочного знака в начале, он вынужден выполнять сканирование таблицы. Он не может использовать индекс.

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

Вам может понравиться моя презентация Развертывание полнотекстового поиска , в которой я сравнил несколько различных решений для полнотекстовой индексации.

...