SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.03.2010 14:33:31

ScDewt
Участник
Зарегистрирован: 30.03.2010
Сообщений: 3

bigint vs varchar

Для начала суть задачи:
есть таблица, для привязки телефонов к пользователям:
+-------------------------------------+------------------+
| telephone (varchar[20]) PRIMARY KEY |   id_user (int[4])  |
+-------------------------------------+------------------+
|       895011111111                          |             1           |
+-------------------------------------+------------------+
|       895022222222                          |             2           |
+-------------------------------------+------------------+
|       895033333333                          |             2           |
+-------------------------------------+------------------+


, где telephone - содержит номер телефона пользователя ((!)только цифры), является уникальным,
т.к. один телефон может принадлежать только одному пользователю, одновременно один пользователь может иметь много телефонов
id_user - привязан к номеру телефона

Дополнительные данные:
записей в такой таблице: 20 000 + каждую неделю по 10-100 записей
запись в таблицу осуществляется редко - несоклько раз в неделю
чтение и поиск осуществляется в 90% запросов по полю telephone (путем полного сравнения, типа WHERE `telephone` = '89501111111')
чтение по данной таблице и связывание её с другими таблицами происходит довольно часто - в час 500-1000 запросов, причем нарвномерно - т.е. минуту может сыпаться десятки запросов, а может всего пару.
в дальнейшем будет увеличение как размера базы так и количества обращений

Вопрос:
Какой тип данных лучше использовать для поля telephone - bigint или varchar?
По какому типу проще искать по bigint или varchar


Вопрос касается оптимизации запросов. Сам пытался тестировать на отдельном сервере, результаты по скорости не сильно отличаются и разница больше похожа на погрешность, но это у меня при единичных запросах, как поведет себя БД при куче запросов с разу - незнаю.

Неактивен

 

#2 30.03.2010 14:41:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: bigint vs varchar

bigint

Неактивен

 

#3 30.03.2010 15:51:00

ScDewt
Участник
Зарегистрирован: 30.03.2010
Сообщений: 3

Re: bigint vs varchar

vasya написал:

bigint

Можно подробней, а именно чем/почему, на сколько лучше? Может знаете где можно почитать про это сравнение?

p.s. просто хочется более подробно просветиться в данном вопросе.

Неактивен

 

#4 30.03.2010 20:34:54

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: bigint vs varchar

Если все телефоны одинаковой длины, то VARCHAR тут неуместен совершенно. Нужен CHAR.

BIGINT хорош тем, что он занимает меньше места - 8 байт вместо 11 на CHAR.

Но еще лучше будет DECIMAL(11,0) - т.к. он займет еще меньше байт - 5 или 6.
Я бы на вашем месте остановился именно на нём.

В данном случае длина поля особенно важна, т.к. по нему ключ, причем постоянно использующийся - надо, чтобы в буфер помещался и др.

Неактивен

 

#5 31.03.2010 14:15:57

ScDewt
Участник
Зарегистрирован: 30.03.2010
Сообщений: 3

Re: bigint vs varchar

LazY написал:

Если все телефоны одинаковой длины, .......
Но еще лучше будет DECIMAL(11,0) - т.к. он займет еще меньше байт - 5 или 6.
Я бы на вашем месте остановился именно на нём........

Спасибо большое. DECIMAL(11,0) - действительно хорош

Неактивен

 

#6 01.04.2010 22:44:51

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: bigint vs varchar

LazY написал:

Если все телефоны одинаковой длины, то VARCHAR тут неуместен совершенно. Нужен CHAR.

Еще могу привести следующую выдержку из документации:

http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html написал:

MySQL uses indexes for these operations:
To retrieve rows from other tables when performing joins. MySQL can use indexes on columns more efficiently if they are declared as the same type and size. In this context, VARCHAR and CHAR are considered the same if they are declared as the same size. For example, VARCHAR(10) and CHAR(10) are the same size, but VARCHAR(10) and CHAR(15) are not.

Отредактированно FiMko (01.04.2010 22:58:22)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson