Простой запрос выбора, занимающий слишком много времени в MySQL-таблице с большим набором данных 10M - PullRequest
1 голос
/ 05 июня 2019
SELECT *
FROM many_leads_lead_details
WHERE location LIKE '%Los%Angeles%'
  AND (keywords LIKE '%Real%' or
       keywords LIKE '%Real Estate%' or
       keywords LIKE '%Real Estate Agent%')

запрос выше занимает слишком много времени по сравнению с базой данных localhost.

время обработки базы данных размещается на другом сервере, время отклика, как показано ниже, Localhost = 30.00 секунд и на rds.amazonaws.com= 1,50 минут

$leads2 = LeadDetails::query();
        $temp = '';
        $location = str_replace(' ', '%', explode(',', $campaign->location)[0]);
        $leads2->Where('location', 'like', '%' . $location . '%');
        //dd($leads2->get());
        $leads2->Where(function ($query) use ($campaign, $temp) {
            foreach (explode(' ', $campaign->keywords) as $index => $keyword) {
                if ($index == 0) {
                    $temp .= $keyword;
                } else {
                    $temp .= ' ' . $keyword;
                }
                $query->OrWhere('keywords', 'like', '%' . $temp . '%');
            }
        });
$leads2->get();

enter image description here

enter image description here

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Этот запрос:

SELECT *
FROM many_leads_lead_details
WHERE location LIKE '%Los%Angeles%'
  AND (keywords LIKE '%Real%' or
       keywords LIKE '%Real Estate%' or
       keywords LIKE '%Real Estate Agent%')

требует полного сканирования таблицы.Индексы нельзя использовать из-за подстановочных знаков в начале шаблонов LIKE.

Мое первое предложение - исправить вашу модель данных.Я подозреваю, что вы храните несколько значений в keywords.Они должны быть в отдельной таблице.

Второе предложение - использовать полнотекстовый поиск - функция match().Это слишком длинная тема для ответа здесь.Вам следует начать с документации .

1 голос
/ 06 июня 2019
WHERE location LIKE '%Los%Angeles%'
  AND (keywords LIKE '%Real%' or
       keywords LIKE '%Real Estate%' or
       keywords LIKE '%Real Estate Agent%')

->

WHERE MATCH(location, keywords) AGAINST ('Los Angeles Real Estate Agent')

и имеют

FULLTEXT(location, keywords)

Это будет работать лот быстрее.

0 голосов
/ 05 июня 2019

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

  1. Убедитесь, что у вас одинаковые индексы на обоих серверах.

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

    СТАТИСТИКА ОБНОВЛЕНИЯ [many_leads_lead_details] WITH ROWCOUNT = 50000000, PAGECOUNT = 500000

Попробуйте обновить статистику и повторите запрос.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...