С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 16/08/08 в 22:38 |
собсно при работе с 10м записей в таблице SELECT ... LIMIT 1 запрос подтормаживает на 2-3 сек... с 10к записями все норма
вопрос, как можно оптимизировать операции с таблицами больших объемов?
|
|
|
|
С нами с 16.09.05
Сообщения: 38
Рейтинг: 54
|
Добавлено: 16/08/08 в 22:46 |
|
|
|
|
С нами с 01.03.07
Сообщения: 304
Рейтинг: 223
|
Добавлено: 17/08/08 в 09:41 |
ты бы структуру таблицы показал бы ?
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 17/08/08 в 11:24 |
Код: | 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`)
);
|
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 17/08/08 в 12:04 |
индексы добавь сначала.
А потом все зависит от железа, типа запроса.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
5
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 17/08/08 в 15:28 |
1) везде varchar() замени на char().
2) если база в 10м записей, убери KEY `user_id` (`user_id`).
3) сконвертируй базу в InnoDB тип.
Чудес на обещаю, но должно помочь.
|
|
|
|
С нами с 09.08.08
Сообщения: 101
Рейтинг: 70
|
Добавлено: 18/08/08 в 00:07 |
Ставишь форум на такую железку и всё будет нормально работать
Цитата: |
...
2) если база в 10м записей, убери KEY `user_id` (`user_id`).
...
|
Это форум. Там при каждом открытии страницы куча запросов с выборкой по этому полю проходит.
А вообще, надо сам запрос увидеть. Вслепую тока ёжики сношаются
|
|
|
|
« ... full on ... »
С нами с 17.03.07
Сообщения: 670
Рейтинг: 1686
|
Добавлено: 18/08/08 в 07:39 |
Как вариант - разделить таблицу на 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 и т.п.), т.к. это лочит таблицу при каждом запросе.
|
|
Power of the lime madness...
|
5
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 18/08/08 в 11:23 |
nostalgie писал: |
Это форум. Там при каждом открытии страницы куча запросов с выборкой по этому полю проходит.
|
Я это и без тебя прекрасно знаю, свои домыслы оставляй при себе, если не знаешь о чем говоришь.
|
|
|
|
С нами с 09.08.08
Сообщения: 101
Рейтинг: 70
|
Добавлено: 18/08/08 в 11:40 |
xreload
Я знаю о чем говорю. Я предположил, что выборка идет по user_id. Если убрать с этого поля индекс - тормоза намного увеличатся.
А вообще, топикстартер чего-то недоговорил. Если это чистый phpbb - то приведена неправильная структура таблицы. Если phpbb интегрирован в другой движок, почему нет слов о тормозах при выборке из основной таблицы пользователе?
dixi
|
|
|
|
С нами с 09.08.08
Сообщения: 101
Рейтинг: 70
|
Добавлено: 18/08/08 в 12:32 |
Тьфу блин.. там primary и key
key все-таки стоит убрать
|
|
|
|
С нами с 09.08.08
Сообщения: 101
Рейтинг: 70
|
Добавлено: 18/08/08 в 12:37 |
Тьфу блин.. там primary и key
key все-таки стоит убрать
|
|
|
|
С нами с 01.03.07
Сообщения: 304
Рейтинг: 223
|
Добавлено: 19/08/08 в 23:14 |
если ставишь varchar ставь их кратным 2, если место не жалко то ставь char Для некоторых полей например ICQ , работать будет быстрее но база будет намного больше,
ну и самое главное ключи поставь, как уже тут сказали, везед где можно поставь LIMIT, указывай не * а поля точно, а так запрос сам нужно видеть чтоб точно сказать
|
|
|
|
С нами с 03.05.07
Сообщения: 801
Рейтинг: 825
|
Добавлено: 19/08/08 в 23:39 |
Без запроса тебе тут никто ничего не скажет по теме. Все советуют оптимизировать поля, поставить индексы и т.п. Это всё, само собой, верно. Но может там у тебя в выборке километровое регулярное выражение, или несколько условий с подстроками, или куча джойнов - тогда никакие индексы не помогут. Может у тебя условие 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)) и по нему уже искать.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 20/08/08 в 14:04 |
видимо все-же запрос сложный с left join... сделал в три запроса, стало быстрее работать
|
|
|
|