MySQL запрос не использует индекс, который я хочу - PullRequest
1 голос
/ 08 марта 2011

У меня есть следующий запрос, соединяющий две таблицы:

explain 

    select 
        n.* from npi n left join npi_taxonomy nt on n.NPI=nt.NPI_CODE 

    where 
        n.Provider_First_Name like '%s%' and 
        n.Provider_Last_Name like '%b%' and 
        n.Provider_Business_Practice_Location_Address_State_Name = 'SC' and 
        n.Provider_Business_Practice_Location_Address_City_Name = 'charleston' and 
        n.Provider_Business_Practice_Location_Address_Postal_Code in (29001,29003,29010,29016,29018,29020,29030,29032,29033,29038,29039,29040,29041,29042,29044,29045,29046,29047,29048,29051,29052,29053,29056,29059,29061,29062,29069,29071,29072,29073,29078,29079,29080,29081,29082,29102,29104,29107,29111,29112,29113,29114,29115,29116,29117,29118,29123,29125,29128,29133,29135,29137,29142,29143,29146,29147,29148,29150,29151,29152,29153,29154,29160,29161,29162,29163,29164,29168,29169,29170,29171,29172,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29240,29250,29260,29290,29292,29401,29402,29403,29404,29405,29406,29407,29409) and 
        n.Entity_Type_Code = 1 and 
        nt.Healthcare_Provider_Taxonomy_Code in ('101Y00000X') 

    limit 0,10; 

Я добавил индекс из нескольких столбцов:

npi_fname_lname_state_city_zip_entity для таблицы npi, индексы которойстолбцы в следующем порядке:

NPI,  
Provider_First_Name, 
Provider_First_Name, 
Provider_Business_Practice_Location_Address_State_Name, Provider_Business_Practice_Location_Address_City_Name, Provider_Business_Practice_Location_Address_Postal_Code, 
Entity_Type_Code

Однако, когда я делаю объяснение запроса, он показывает мне, что он использует первичный индекс (NPI).Кроме того, он говорит, что проверенные строки = 1

Что еще хуже: запрос занимает примерно 120 секунд для выполнения.Как мне это оптимизировать?

Буду очень признателен за помощь в этом.

1 Ответ

2 голосов
/ 08 марта 2011

Причина, по которой ваш многостолбцовый индекс не помогает, заключается в том, что вы фильтруете с использованием подстановочного знака like '%s%'.

Индексы можно использовать только при фильтрации с использованием самого левого префикса индекса, что означает, что 1) не может выполнить поиск содержимого , и 2) если невозможно использовать самый левый столбец индекса из нескольких столбцов, другие столбцы в индексе не могутиспользоваться как хорошо .

Вы должны изменить порядок столбцов в индексе на

Provider_Business_Practice_Location_Address_State_Name, 
Provider_Business_Practice_Location_Address_City_Name, 
Provider_Business_Practice_Location_Address_Postal_Code, 
Entity_Type_Code

Таким образом, MySql будет сканировать только те строки, которые соответствуют критериям для этих столбцов.(SC, Чарльстон и т. Д.).

Кроме того, посмотрите полнотекстовые индексы .

...