Задавайте вопросы, мы ответим
Вы не зашли.
Для начала суть задачи:
есть таблица, для привязки телефонов к пользователям:
+-------------------------------------+------------------+
| 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
Вопрос касается оптимизации запросов. Сам пытался тестировать на отдельном сервере, результаты по скорости не сильно отличаются и разница больше похожа на погрешность, но это у меня при единичных запросах, как поведет себя БД при куче запросов с разу - незнаю.
Неактивен
bigint
Неактивен
vasya написал:
bigint
Можно подробней, а именно чем/почему, на сколько лучше? Может знаете где можно почитать про это сравнение?
p.s. просто хочется более подробно просветиться в данном вопросе.
Неактивен
Если все телефоны одинаковой длины, то VARCHAR тут неуместен совершенно. Нужен CHAR.
BIGINT хорош тем, что он занимает меньше места - 8 байт вместо 11 на CHAR.
Но еще лучше будет DECIMAL(11,0) - т.к. он займет еще меньше байт - 5 или 6.
Я бы на вашем месте остановился именно на нём.
В данном случае длина поля особенно важна, т.к. по нему ключ, причем постоянно использующийся - надо, чтобы в буфер помещался и др.
Неактивен
LazY написал:
Если все телефоны одинаковой длины, .......
Но еще лучше будет DECIMAL(11,0) - т.к. он займет еще меньше байт - 5 или 6.
Я бы на вашем месте остановился именно на нём........
Спасибо большое. DECIMAL(11,0) - действительно хорош
Неактивен
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)
Неактивен