Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Оптимизация MySQL
цитата
16/08/08 в 22:38
 ibiz
собсно при работе с 10м записей в таблице SELECT ... LIMIT 1 запрос подтормаживает на 2-3 сек... с 10к записями все норма
вопрос, как можно оптимизировать операции с таблицами больших объемов?
цитата
16/08/08 в 22:46
 janso
Одназначно мало информации для ответа.

http://dev.mysql.com/tech-resources/presentations/presentation-oscon2000-20000719/ конечно же читал уже?
цитата
17/08/08 в 09:41
 leroy_17
ты бы структуру таблицы показал бы ?
цитата
17/08/08 в 11:24
 ibiz
Код:
CREATE TABLE `phpbb_users` (
  `user_id` mediumint(8) NOT NULL default '0',
  `user_active` tinyint(1) default '1',
  `username` varchar(25) NOT NULL default '',
  `user_password` varchar(32) NOT NULL default '',
  `user_email` varchar(255) default NULL,
  `user_icq` varchar(15) default NULL,
  PRIMARY KEY  (`user_id`),
  KEY `user_id` (`user_id`)
);
цитата
17/08/08 в 12:04
 Stek
индексы добавь сначала.
А потом все зависит от железа, типа запроса.
цитата
17/08/08 в 15:28
 xreload
1) везде varchar() замени на char().
2) если база в 10м записей, убери KEY `user_id` (`user_id`).
3) сконвертируй базу в InnoDB тип.

Чудес на обещаю, но должно помочь.
цитата
18/08/08 в 00:07
 nostalgie
Ставишь форум на такую железку и всё будет нормально работать icon_smile.gif

Цитата:

...
2) если база в 10м записей, убери KEY `user_id` (`user_id`).
...


Это форум. Там при каждом открытии страницы куча запросов с выборкой по этому полю проходит.

А вообще, надо сам запрос увидеть. Вслепую тока ёжики сношаются icon_rolleyes.gif
цитата
18/08/08 в 07:39
 Corex
Как вариант - разделить таблицу на 3-4 или более, где в каждой будет 1-2 млн. записей, выборку делать по user_id > N/M/K и т.д. Т.е., если (user_id > 0 && user_id <= 1500000) table = phpbb_users_1, если (user_id > 1500000 && user_id <= 3000000) table = phpbb_users_2 и т.д. Это довольно распространённая практика при делении нагрузки, выхлоп очень неплохой. Такой свитчер ставиться до запроса к базе в приложении (в скрипте PHP, например). Если в PhpBB все SQL-запросы идут через 1 интерфейс (класс вроде adodb), то можно подобный свитчер воткнуть прямо в функции запроса - это 4-5 строчек кода.

При этом, конечно, индексов бы ещё воткнуть и хорошо бы отключить функционал форума, который делает не особо нужные update/delete (вроде last visit time, last ip и т.п.), т.к. это лочит таблицу при каждом запросе.
цитата
18/08/08 в 11:23
 xreload
nostalgie писал:

Это форум. Там при каждом открытии страницы куча запросов с выборкой по этому полю проходит.


Я это и без тебя прекрасно знаю, свои домыслы оставляй при себе, если не знаешь о чем говоришь.
цитата
18/08/08 в 11:40
 nostalgie
xreload
Я знаю о чем говорю. Я предположил, что выборка идет по user_id. Если убрать с этого поля индекс - тормоза намного увеличатся.

А вообще, топикстартер чего-то недоговорил. Если это чистый phpbb - то приведена неправильная структура таблицы. Если phpbb интегрирован в другой движок, почему нет слов о тормозах при выборке из основной таблицы пользователе?

dixi
цитата
18/08/08 в 12:32
 nostalgie
Тьфу блин.. там primary и key

key все-таки стоит убрать
цитата
18/08/08 в 12:37
 nostalgie
Тьфу блин.. там primary и key

key все-таки стоит убрать
цитата
19/08/08 в 23:14
 leroy_17
если ставишь varchar ставь их кратным 2, если место не жалко то ставь char Для некоторых полей например ICQ , работать будет быстрее но база будет намного больше,


ну и самое главное ключи поставь, как уже тут сказали, везед где можно поставь LIMIT, указывай не * а поля точно, а так запрос сам нужно видеть чтоб точно сказать
цитата
19/08/08 в 23:39
 Formator
Без запроса тебе тут никто ничего не скажет по теме. Все советуют оптимизировать поля, поставить индексы и т.п. Это всё, само собой, верно. Но может там у тебя в выборке километровое регулярное выражение, или несколько условий с подстроками, или куча джойнов - тогда никакие индексы не помогут. Может у тебя условие WHERE user_username='user' AND user_password='pass' AND user_email='e@mail' - обычно такие запросы дико тормозят даже на мелких базах. Показал бы запрос, сразу бы всё стало ясно.

Но итак видно, что таблица не очень. "`user_icq` varchar(15) default NULL" - вот это жесть конечно. Если по user_icq идёт выборка, то поле надо делать как BIGINT. Да и CHAR побыстрее VARCHAR.

Если у тебя обычный SELECT * FROM phpbb_users LIMIT 1, то тогда лучше оттюнить мускуль, отдать ему больше памяти. Проверь ещё чтобы тейбл был MyISAM. В любом случае, погляди сам, или попроси админа, переменные: table_cache, key_buffer, back_log (может ты выполняешь запрос с уже сильно нагруженной базой), sort_buffer, thread_concurrency (если многопроцессорная система) и т.п.

Ещё вариант, если ты реально ищешь по строкам и можешь подправить софт. К примеру, ты всегда ищешь по юзеру и пассу (проверка на логин, очень часто юзается) - в данном случае проще сделать хеш для каждого юзера (что-нибудь вроде crc32($username.$password)) и по нему уже искать.
цитата
20/08/08 в 14:04
 ibiz
видимо все-же запрос сложный с left join... сделал в три запроса, стало быстрее работать


Эта страница в полной версии