MySQL Index на первую часть строки - PullRequest
1 голос
/ 22 сентября 2011

Я запрашиваю очень большую таблицу (более 3M записей) в MySQL, в которой есть category_id, subcategory_id и zipcode. Почтовый индекс может содержать или не содержать 10 символов в БД.

Цель состоит в том, чтобы получить все элементы кошки / подкатушки с определенным радиусом указанного почтового индекса. У меня есть функция, которая возвращает список из 5-значных почтовых индексов для одного указанного. Этот список затем подается на мой запрос, например ...

SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND LEFT(zip,5) IN (11111,22222,33333,44444,55555)

У меня есть составной индекс для cat_id, subcat_id и zip, но zip, состоящий из 10 символов, в некоторых случаях может сбрасывать его. Можно ли как-нибудь индексировать ЛЕВЫЙ (zip, 5)?

Ответы [ 4 ]

4 голосов
/ 01 декабря 2016

Чтобы ответить на ваш вопрос напрямую: да, вы можете индексировать влево (zip, 5).

alter table tblName add index (zip(5));

И если вы хотите, чтобы запрос мог использовать индекс для поиска во всех столбцах:

alter table tblName add index (cat_id, subcat_id, zip(5));
1 голос
/ 22 сентября 2011

У вас должен быть столбец с обычным 5-значным почтовым индексом и столбец со всеми дополнительными цифрами, и пусть SQL обрабатывает его нормально.Есть способы сделать то, о чем вы говорите, но это, безусловно, самое эффективное решение.

1 голос
/ 22 сентября 2011

Если вы хотите использовать индекс, измените запрос на:

SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND (   zip LIKE '11111%'
     OR zip LIKE '22222%'
     OR zip LIKE '33333%'
     OR zip LIKE '44444%'
     OR zip LIKE '55555%')

Другим вариантом является денормализация таблицы (она должна быть последней) и добавление дополнительного поля, содержащего 5 самых левых символов в zip. Тогда вы можете сделать:

SELECT whatever
FROM tblName
WHERE cat_id = 1
AND subcat_id = 5
AND LEFTzip5 IN (11111,22222,33333,44444,55555)

Не забудьте поставить индекс в поле leftzip5.

0 голосов
/ 22 сентября 2011

Я действительно сомневаюсь, что вы можете индексировать только LEFT (5) Zip, но если это возможно для вас, я бы создал дополнительный столбец в таблице и обновил бы его LEFT (5) из ZIP, а затем я бы проиндексировал этот столбец как улучшить мои показатели

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