skoder
@skoder
web программист

Как ускорить поиск по таблице?

Есть MySQL табличка
CREATE TABLE IF NOT EXISTS `users` (
  `IDClient` int(11) NOT NULL,
  `Phone` varchar(15) NOT NULL,
  `passw` varchar(32) NOT NULL,
  `ip` varchar(50) DEFAULT NULL COMMENT 'IP адрес'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY KEY (Phone)
PARTITIONS 10 */;
ALTER TABLE `users`
  ADD PRIMARY KEY (`Phone`),
  ADD KEY `IDClient` (`IDClient`),
  ADD KEY `ip` (`ip`);

В ней порядка 3млн записей. Когда сайт не нагружен поиск
SELECT * FROM users WHERE phone='9123456789' LIMIT 1

занимает порядка 0.03 сек, но когда сайт подзагружается это время может дойти и до 5сек.
Кто в теме, можете что-нибудь посоветовать? Ведь даже 0.03 сек, имхо, много, для такого банального запроса.

UPD. MySQL сервер
Сервер: Localhost via UNIX socket
Тип сервера: Percona Server
Версия сервера: 5.6.26-74.0-log - Percona Server (GPL), Release 74.0, Revision 32f8dfd

Explain
id     select_type  table     type          possible_keys       key             key_len          ref         rows     Extra
1      SIMPLE        users    range         PRIMARY             PRIMARY       47               NULL     1 	 NULL


Может быть поможет реальное разбиение таблицы на 2,5,10 таблиц?
  • Вопрос задан
  • 577 просмотров
Пригласить эксперта
Ответы на вопрос 4
@protven
Используйте кеширование же. Мемкешед или редис спасут отца русской демократии. А так, ну можно тюнить ваш мускуль "по фотографии", но толку от этого ноль.
Ответ написан
@drevil
Linux-сисадмин
чем сервер занят в прайм-тайм?
большой iowait?

какой тип у поля Phone?
строка? А надо число.
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
Using where; Using filesort
filesort Вас не смущает?
Интимного плана вопрос - а зачем Вам Limit 1 ? У Вас возможно несколько одинаковых телефонов? Если да - то в чем смысл такого запроса?
Ответ написан
@Joysi75
`Phone` varchar(15) NOT NULL
Если позволяет место на сервере лучше смените на
`Phone` char(15) NOT NULL или (если не хранятся в значениях нецифровые символы - скобки, например)`Phone` int NOT NULL
Так как в этом случае будет индексироваться по ключу фиксированной длины (в случае с int еще лучше, будет индексироваться по 4/8 байтам вместо 15) - соответственно поиск будет быстрее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы