MySQL индексация телефонных номеров - PullRequest
2 голосов
/ 29 октября 2011

Я работаю тоннами телефонных номеров, и многие из них являются международными.

Я изменил структуру таблицы телефонных номеров на 5 столбцов:

`phonenumbers`.`phoneID`
`phonenumbers`.`countrycode`
`phonenumbers`.`areacode`
`phonenumbers`.`phonenumber`
`phonenumbers`.`ext`

На данный момент phoneID является единственным столбцом, который является INT, поскольку это первичный ключ.

Должен ли я изменить другие столбцы на целые числа? Я слышал, что индексы лучше всего работают с числовыми значениями, и я храню только числа в каждом из столбцов (без черточек, скобок, пробелов и т. Д.)

Я все еще изучаю, как MySQL работает с индексами, поэтому мне любопытно, как другие работают с поиском чисел. В этом случае, я уверен, что я буду искать числа, которые начинаются с определенного известного areacode и части известного phonenumber или целого phonenumber.

То, что меня привлекает при индексировании и столбцах таблиц, таких как номера телефонов, заключается в том, что я не всегда знаю, как долго будет phonenumber. Поскольку страны имеют разную длину для ареакодов и телефонных номеров.

Таким образом, индексирование INT и VARCHAR с помощью чисел.

Ответы [ 4 ]

4 голосов
/ 29 октября 2011

Номера телефонов не являются целыми числами, поэтому не храните их как единое целое, это только доставит вам неприятности. Очевидные случаи - когда вам приходится работать с телефонными номерами, слишком большими, чтобы поместиться в int, или телефонными номерами, начинающимися с 0.

Более того, поскольку вы хотите выполнять сопоставление префиксов (phonenumber like '800%'), mysql сможет использовать индексы, если вы используете столбцы varchar.

Вы должны выяснить, как вы запрашиваете эти данные, если вы часто делаете запросы, такие как where countrycode='1' and areacode='123' and phonenumber like '2%', вам нужен составной индекс (код страны, areacode, номер телефона), и если вы также часто выполняя запросы только по номеру телефона, вам нужен дополнительный индекс только для столбца номера телефона, но это то, что вам нужно выработать, углубляясь в объем данных, которые у вас есть, и запросов, которые вы делаете - работайте с EXPLAIN чтобы узнать, как используются ваши индексы и где они нужны.

1 голос
/ 29 октября 2011

Используйте varchar для представления телефонных номеров НЕ целых чисел. В противном случае вы найдете, что ваше дизайнерское решение вернется, чтобы укусить вас.

Также: «Я слышал, что индексы лучше всего работают с числовыми значениями» - ну, это не совсем точно: да, индекс будет занимать меньше места, и на страницу будет помещаться больше строк и т. Д., Но индекс в столбце varchar отлично работает.

Беспокойство по поводу размера и производительности индекса, когда (1) у вас огромное количество данных и (2), когда вы измерили проблему с производительностью.

0 голосов
/ 29 октября 2011

Используйте BIGINT UNSIGNED просто, потому что это заставляет вас нормализовать ваши данные. Заставьте своего пользователя хранить номер телефона в корневом уровне. Это означает, что на уровне страны. Вы можете сохранить префикс страны в отдельном столбце, чтобы упростить использование.

Каждый вводит телефонные номера по-разному, и это делает практически невозможным поиск данных.

например. %020123456% не будет соответствовать 02 0123456. Собираетесь ли вы искать все комбинации или просто проанализировать их?

Это, как я знаю из опыта, нам пришлось вручную исправить около 1000 телефонных номеров, которые мы не могли написать при установке автонабора

0 голосов
/ 29 октября 2011

По моему мнению, у вас есть много атрибутов, которые вам не нужны, и для телефонных номеров я обычно использую ключ автоинкремента для идентификатора, а номер телефона - varchar.Это облегчает проверку с использованием языка программирования.Это мое мнение ...

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