Вопросы по MySQL

 
1 2 3
+
-
edit
 

Balancer

администратор
★★★★★
База нашего форума сейчас весит около ~300Мб (~200тыс. записей).

В оригинале в iBF используется традиционая уже схема "компиляции" своего языка разметки в HTML при написании сообщения и "декомпиляции" сообщений из HTML при редактировании.

Я давно уже использую доработку, когда исходник сообщения хранится отдельно и компиляция идёт только в одну сторону, из языка разметки в HTML.

Сейчас исходники хранятся в общей таблице сообщений, наряду с компилированным текстом и служебной инфой.

Но форум начал притормаживать на некоторых задачах, требующих массового вмешательства в таблицу (перемещение топика или сообщений в другой форум, даже поиск и т.п.).

Будет ли выигрышь по скорости этих операций (в частности, вообще SELECT'ы по другим полям этой таблицы), если я исходники сообщений переброшу в отдельную таблицу (объём основной таблицы уменьшится раза в полтора-два).
 

hcube

старожил
★★
А индексирование по полной программе сделано? Всех полей? Далее, для полей типа TEXT индексирования не существует, так что для поиска по ключевым словам лучше использовать VarChar(255). Еще попробуй сделать expalin <select> - оно показывает как этот select обрабатывается.
Убей в себе зомби!  
+
-
edit
 

Balancer

администратор
★★★★★
hcube, 01.02.2004 22:15:20:
А индексирование по полной программе сделано? Всех полей?
 

По тем, по которым доступ нужен, если они не цифровые, вроде, сделан

>Далее, для полей типа TEXT индексирования не существует, так что для поиска по ключевым словам лучше использовать VarChar(255).

Дык, какой на форуме поиск по ключевым словам? Только полный Но поиск как раз ресурсов-то мало жрёт, потому как редко используется.

>Еще попробуй сделать expalin
 

hcube

старожил
★★
explain, пардон, ошибся. Далее - идея вынести текст в отдельную базу - с одной стороны, идея здравая, поскольку сообщение при выборке по базе с фиксированным размером ячейки выбирается в разы шустрее. С другой стороны - два раза выбирается в результате. Так что по большому счету скорость выборки зависит от логарифма размера индексного файла на количество выбираемых записей. Где-то так. Если же какие-то функции считаются... то это выборку сильно тормозит. Опять же рекомендуется наиболее простые условия ставить вперед, а сложные, типа body like '%text%' - назад. Еще можно на каждый форум свою базу сделать - тоже вариант.
Убей в себе зомби!  
+
-
edit
 

Balancer

администратор
★★★★★
hcube, 01.02.2004 23:36:15:
Далее - идея вынести текст в отдельную базу - с одной стороны, идея здравая, поскольку сообщение при выборке по базе с фиксированным размером ячейки выбирается в разы шустрее. С другой стороны - два раза выбирается в результате.
 

Нет, ты не совсем понял
При просмотре выборки оттуда совсем не будет, т.к. я собираюсь выносить только исходник. Он нужен только для редактирования. Ну, в перспективе - под всякие перекомпиляции страниц.

Т.е. вынесение его в другую таблицу не приведёт к лишнему запросу при обычно обращении (разве что при ответе с цитированием, но это более редкий случай).

Вопрос именно в том будет ли выигрышь в производительности.

Потому что, как я представляю идеальную БД, для SELECT'ов все поля хешированы, хеши расположены по фиксированным матрицам, так что есть лишнее поле в записи или нет, если к нему обращения нет, на скорость выборки не влияет.

Не потому ли "массивность" MySQL баз обычно измеряют в количестве записей, а не количестве записей * количество полей?

В общем-то, серьёзной переделкой форума я всё равно до версии 2.0 заниматься не буду, но подумать об этом уже сейчас стоит
 
+
-
edit
 

Balancer

администратор
★★★★★
hcube, 01.02.2004 23:36:15:
Опять же рекомендуется наиболее простые условия ставить вперед, а сложные, типа body like '%text%' - назад.
 

Угу, понятно. Но там условия обычно все простые. Эти LIKE только для поиска нужны.

> Еще можно на каждый форум свою базу сделать - тоже вариант.

Не пойдёт. В этом форуме используется идеология сквозной нумерации топиков, что, с одной стороны правильно (позволяет переносит топики не меняя их адреса, позволяет более просто организовывать поиск по всей базе и т.п.), с другой - не позволяет разбить базу на несколько.

Как вариант, правда, организация альтернативных форумов, с использованием всяких перекрёстных автоссылок и т.п. Вот, скажем, у нас же висит, но не только с базой другой, но даже с другим экземпляром скриптов
 
+
-
edit
 

Mishka

модератор
★★★

Ром, а где-то была dbschema базы на форумах? Чтобы посмотреть? А то так сложно советы выдавать.
 
+
-
edit
 

Balancer

администратор
★★★★★
Mishka, 02.02.2004 18:21:19:
Ром, а где-то была dbschema базы на форумах? Чтобы посмотреть? А то так сложно советы выдавать.
 

Как бы её поприличнее выдать?
Идеальный вариант - это, конечно, ссылка на исходники форума

В кратце по таблице с постингами:

[color=#808030; ]#[/color] phpMyAdmin SQL Dump [color=#808030; ]#[/color] version [color=#008000; ]2.5[/color][color=#808030; ].[/color][color=#008c00; ]3[/color][color=#808030; ]-[/color]rc1 [color=#808030; ]#[/color] [color=#808030; ][[/color]url http:[color=#808030; ]/[/color][color=#808030; ]/[/color]www[color=#808030; ].[/color]phpmyadmin[color=#808030; ].[/color]net[color=#808030; ]|[/color]http:[color=#808030; ]/[/color][color=#808030; ]/[/color]www[color=#808030; ].[/color]phpmyadmin[color=#808030; ].[/color]net[color=#808030; ]][/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] [color=#e34adc; ]Хост:[/color] localhost [color=#808030; ]#[/color] Время [color=#e34adc; ]создания:[/color] Фев [color=#008c00; ]02[/color] [color=#008c00; ]2004[/color] г[color=#808030; ].[/color][color=#808030; ],[/color] [color=#008c00; ]18[/color]:59 [color=#808030; ]#[/color] Версия [color=#e34adc; ]сервера:[/color] [color=#008000; ]4.0[/color][color=#808030; ].[/color][color=#008c00; ]16[/color] [color=#808030; ]#[/color] Версия [color=#e34adc; ]PHP:[/color] [color=#008000; ]4.3[/color][color=#808030; ].[/color][color=#008c00; ]4[/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] [color=#e34adc; ]БД :[/color] `FORUM` [color=#808030; ]#[/color] [color=#808030; ]#[/color] [color=#696969; ]--------------------------------------------------------[/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] Структура таблицы `ib_posts` [color=#808030; ]#[/color] CREATE TABLE `ib_posts` [color=#808030; ]([/color]   `append_edit` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `edit_time` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `pid` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] NOT NULL auto_increment[color=#808030; ],[/color]   `ubb_topic` varchar[color=#808030; ]([/color][color=#008c00; ]11[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `ubb_post` int[color=#808030; ]([/color][color=#008c00; ]11[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `author_id` mediumint[color=#808030; ]([/color][color=#008c00; ]8[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `author_name` varchar[color=#808030; ]([/color][color=#008c00; ]32[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `use_sig` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `use_emo` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `ip_address` varchar[color=#808030; ]([/color][color=#008c00; ]16[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `post_date` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `icon_id` smallint[color=#808030; ]([/color][color=#008c00; ]3[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `source` text[color=#808030; ],[/color]   `post` text[color=#808030; ],[/color]   `queued` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `topic_id` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `forum_id` smallint[color=#808030; ]([/color][color=#008c00; ]5[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `attach_id` varchar[color=#808030; ]([/color][color=#008c00; ]64[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `attach_hits` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `attach_type` varchar[color=#808030; ]([/color][color=#008c00; ]128[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `attach_file` varchar[color=#808030; ]([/color][color=#008c00; ]255[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `post_title` varchar[color=#808030; ]([/color][color=#008c00; ]255[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `new_topic` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `edit_name` varchar[color=#808030; ]([/color][color=#008c00; ]255[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `post_type` varchar[color=#808030; ]([/color][color=#008c00; ]4[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   PRIMARY KEY  [color=#808030; ]([/color]`pid`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `topic_id` [color=#808030; ]([/color]`topic_id`[color=#808030; ],[/color]`author_id`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `author_id` [color=#808030; ]([/color]`author_id`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `forum_id` [color=#808030; ]([/color]`forum_id`[color=#808030; ],[/color]`post_date`[color=#808030; ])[/color][color=#808030; ],[/color]   FULLTEXT KEY `source` [color=#808030; ]([/color]`source`[color=#808030; ])[/color] [color=#808030; ])[/color] TYPE[color=#808030; ]=[/color]MyISAM AUTO_INCREMENT[color=#808030; ]=[/color][color=#008c00; ]342252[/color] [color=#808030; ];[/color]
Created with colorer-take5 library. Type 'sql'
 

hcube

старожил
★★
А характерный SQL - запрос? Который оптимизировать надо? А если еще и с explain...
Убей в себе зомби!  
+
-
edit
 

Balancer

администратор
★★★★★
Самый массовый запрос (постинги данного топика форума):
<?[/span]         $DB->query("SELECT p.*,                     m.id,m.name,m.mgroup,m.email,m.joined,m.avatar,m.avatar_size,m.posts,m.aim_name,m.icq_number,                     m.signature, m.website,m.yahoo,m.integ_msg,m.title,m.hide_email,m.msnname, m.warn_level, m.warn_lastwarn, m.location,                     g.g_id, g.g_title, g.g_icon, m.rep, g.g_dohtml $join_get_fields                     FROM ib_posts p                       LEFT JOIN ib_members m ON (p.author_id=m.id)                       LEFT JOIN ib_groups g ON (g.g_id=m.mgroup)                       $join_profile_query                     WHERE p.topic_id=".$this->topic[[/color]'tid'[color=#808030; background:#ffffe8; ]]." and p.queued != 1                     ORDER BY p.pid LIMIT $first, ".$ibforums->vars[[/color]'display_max_posts'[color=#808030; background:#ffffe8; ]]); >? [span style='color:#000000; background:#ffffe8; ']
Created with colorer-take5 library. Type 'php'


$join_profile_query обычно пуст, как я понимаю (пока не лез разбираться в код досконально)

Таблицы:
[color=#808030; ]#[/color] phpMyAdmin SQL Dump [color=#808030; ]#[/color] version [color=#008000; ]2.5[/color][color=#808030; ].[/color][color=#008c00; ]3[/color][color=#808030; ]-[/color]rc1 [color=#808030; ]#[/color] [color=#808030; ][[/color]url http:[color=#808030; ]/[/color][color=#808030; ]/[/color]www[color=#808030; ].[/color]phpmyadmin[color=#808030; ].[/color]net[color=#808030; ]|[/color]http:[color=#808030; ]/[/color][color=#808030; ]/[/color]www[color=#808030; ].[/color]phpmyadmin[color=#808030; ].[/color]net[color=#808030; ]][/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] [color=#e34adc; ]Хост:[/color] localhost [color=#808030; ]#[/color] Время [color=#e34adc; ]создания:[/color] Фев [color=#008c00; ]02[/color] [color=#008c00; ]2004[/color] г[color=#808030; ].[/color][color=#808030; ],[/color] [color=#008c00; ]19[/color]:29 [color=#808030; ]#[/color] Версия [color=#e34adc; ]сервера:[/color] [color=#008000; ]4.0[/color][color=#808030; ].[/color][color=#008c00; ]16[/color] [color=#808030; ]#[/color] Версия [color=#e34adc; ]PHP:[/color] [color=#008000; ]4.3[/color][color=#808030; ].[/color][color=#008c00; ]4[/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] [color=#e34adc; ]БД :[/color] `FORUM` [color=#808030; ]#[/color] [color=#808030; ]#[/color] [color=#696969; ]--------------------------------------------------------[/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] Структура таблицы `ib_groups` [color=#808030; ]#[/color] CREATE TABLE `ib_groups` [color=#808030; ]([/color]   `g_id` int[color=#808030; ]([/color][color=#008c00; ]3[/color][color=#808030; ])[/color] unsigned NOT NULL auto_increment[color=#808030; ],[/color]   `g_view_board` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_mem_info` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_other_topics` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_use_search` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_email_friend` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_invite_friend` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_edit_profile` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_post_new_topics` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_reply_own_topics` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_reply_other_topics` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_edit_posts` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_delete_own_posts` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_open_close_posts` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_delete_own_topics` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_post_polls` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_vote_polls` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_use_pm` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_is_supmod` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_access_cp` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_title` varchar[color=#808030; ]([/color][color=#008c00; ]32[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `g_can_remove` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_append_edit` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_access_offline` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_avoid_q` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_avoid_flood` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_icon` varchar[color=#808030; ]([/color][color=#008c00; ]64[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_attach_max` bigint[color=#808030; ]([/color][color=#008c00; ]20[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_avatar_upload` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_calendar_post` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `prefix` varchar[color=#808030; ]([/color][color=#008c00; ]250[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `suffix` varchar[color=#808030; ]([/color][color=#008c00; ]250[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `g_max_messages` int[color=#808030; ]([/color][color=#008c00; ]5[/color][color=#808030; ])[/color] default [color=#0000e6; ]'50'[/color][color=#808030; ],[/color]   `g_max_mass_pm` int[color=#808030; ]([/color][color=#008c00; ]5[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_search_flood` mediumint[color=#808030; ]([/color][color=#008c00; ]6[/color][color=#808030; ])[/color] default [color=#0000e6; ]'20'[/color][color=#808030; ],[/color]   `g_edit_cutoff` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_promotion` varchar[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default [color=#0000e6; ]'-1&-1'[/color][color=#808030; ],[/color]   `g_hide_from_list` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_post_closed` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_perm_id` varchar[color=#808030; ]([/color][color=#008c00; ]255[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `g_photo_max_vars` varchar[color=#808030; ]([/color][color=#008c00; ]200[/color][color=#808030; ])[/color] default [color=#0000e6; ]'100:250:250'[/color][color=#808030; ],[/color]   `g_dohtml` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_edit_topic` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `g_email_limit` varchar[color=#808030; ]([/color][color=#008c00; ]15[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'10:15'[/color][color=#808030; ],[/color]   PRIMARY KEY  [color=#808030; ]([/color]`g_id`[color=#808030; ])[/color] [color=#808030; ])[/color] TYPE[color=#808030; ]=[/color]MyISAM AUTO_INCREMENT[color=#808030; ]=[/color][color=#008c00; ]12[/color] [color=#808030; ];[/color] [color=#808030; ]#[/color] [color=#696969; ]--------------------------------------------------------[/color] [color=#808030; ]#[/color] [color=#808030; ]#[/color] Структура таблицы `ib_members` [color=#808030; ]#[/color] CREATE TABLE `ib_members` [color=#808030; ]([/color]   `id` mediumint[color=#808030; ]([/color][color=#008c00; ]8[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `ubb_id` int[color=#808030; ]([/color][color=#008c00; ]11[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `name` varchar[color=#808030; ]([/color][color=#008c00; ]32[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `mgroup` smallint[color=#808030; ]([/color][color=#008c00; ]3[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `password` varchar[color=#808030; ]([/color][color=#008c00; ]32[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `email` varchar[color=#808030; ]([/color][color=#008c00; ]60[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `joined` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `ip_address` varchar[color=#808030; ]([/color][color=#008c00; ]16[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `avatar` varchar[color=#808030; ]([/color][color=#008c00; ]128[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `avatar_size` varchar[color=#808030; ]([/color][color=#008c00; ]9[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `posts` mediumint[color=#808030; ]([/color][color=#008c00; ]7[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `aim_name` varchar[color=#808030; ]([/color][color=#008c00; ]40[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `icq_number` varchar[color=#808030; ]([/color][color=#008c00; ]40[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `location` varchar[color=#808030; ]([/color][color=#008c00; ]128[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `signature` text[color=#808030; ],[/color]   `website` varchar[color=#808030; ]([/color][color=#008c00; ]70[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `yahoo` varchar[color=#808030; ]([/color][color=#008c00; ]32[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `title` varchar[color=#808030; ]([/color][color=#008c00; ]64[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `allow_admin_mails` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `time_offset` varchar[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `interests` text[color=#808030; ],[/color]   `hide_email` varchar[color=#808030; ]([/color][color=#008c00; ]8[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `email_pm` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `email_full` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `skin` smallint[color=#808030; ]([/color][color=#008c00; ]5[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `warn_level` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `warn_lastwarn` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `language` varchar[color=#808030; ]([/color][color=#008c00; ]32[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `msnname` varchar[color=#808030; ]([/color][color=#008c00; ]64[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `last_post` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `restrict_post` varchar[color=#808030; ]([/color][color=#008c00; ]100[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `view_sigs` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'1'[/color][color=#808030; ],[/color]   `view_img` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'1'[/color][color=#808030; ],[/color]   `view_avs` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'1'[/color][color=#808030; ],[/color]   `view_pop` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'1'[/color][color=#808030; ],[/color]   `bday_day` int[color=#808030; ]([/color][color=#008c00; ]2[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `bday_month` int[color=#808030; ]([/color][color=#008c00; ]2[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `bday_year` int[color=#808030; ]([/color][color=#008c00; ]4[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `new_msg` tinyint[color=#808030; ]([/color][color=#008c00; ]2[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `msg_from_id` mediumint[color=#808030; ]([/color][color=#008c00; ]8[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `msg_msg_id` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `msg_total` smallint[color=#808030; ]([/color][color=#008c00; ]5[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `vdirs` text[color=#808030; ],[/color]   `show_popup` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `misc` varchar[color=#808030; ]([/color][color=#008c00; ]128[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `last_visit` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `last_activity` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `dst_in_use` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `view_prefs` varchar[color=#808030; ]([/color][color=#008c00; ]64[/color][color=#808030; ])[/color] default [color=#0000e6; ]'-1&-1'[/color][color=#808030; ],[/color]   `coppa_user` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `mod_posts` varchar[color=#808030; ]([/color][color=#008c00; ]100[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `auto_track` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `org_supmod` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] default [color=#0000e6; ]'0'[/color][color=#808030; ],[/color]   `org_perm_id` varchar[color=#808030; ]([/color][color=#008c00; ]255[/color][color=#808030; ])[/color] default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `temp_ban` varchar[color=#808030; ]([/color][color=#008c00; ]100[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `integ_msg` varchar[color=#808030; ]([/color][color=#008c00; ]250[/color][color=#808030; ])[/color] default [color=#0000e6; ]''[/color][color=#808030; ],[/color]   `rep` int[color=#808030; ]([/color][color=#008c00; ]10[/color][color=#808030; ])[/color] default NULL[color=#808030; ],[/color]   `allow_rep` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'1'[/color][color=#808030; ],[/color]   `allow_anon` tinyint[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color] NOT NULL default [color=#0000e6; ]'1'[/color][color=#808030; ],[/color]   PRIMARY KEY  [color=#808030; ]([/color]`id`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `name` [color=#808030; ]([/color]`name`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `mgroup` [color=#808030; ]([/color]`mgroup`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `bday_day` [color=#808030; ]([/color]`bday_day`[color=#808030; ])[/color][color=#808030; ],[/color]   KEY `bday_month` [color=#808030; ]([/color]`bday_month`[color=#808030; ])[/color] [color=#808030; ])[/color] TYPE[color=#808030; ]=[/color]MyISAM[color=#808030; ];[/color]
Created with colorer-take5 library. Type 'sql'
 
+
-
edit
 

Balancer

администратор
★★★★★
explain буде чуть позже
 
+
-
edit
 

Balancer

администратор
★★★★★
hcube, 02.02.2004 19:17:32:
А если еще и с explain...
 

К сожалению, mysql у меня чего-то к базе не цепляется (т.е. сокета не видит), так что выполнил через phpMyAdmin. Он результат сам отобразил, так что вывожу что получилось

Запрос:
EXPLAIN SELECT p[color=#808030; ].[/color] [color=#808030; ]*[/color] [color=#808030; ],[/color] m[color=#808030; ].[/color]id[color=#808030; ],[/color] m[color=#808030; ].[/color]name[color=#808030; ],[/color] m[color=#808030; ].[/color]mgroup[color=#808030; ],[/color] m[color=#808030; ].[/color]email[color=#808030; ],[/color] m[color=#808030; ].[/color]joined[color=#808030; ],[/color] m[color=#808030; ].[/color]avatar[color=#808030; ],[/color] m[color=#808030; ].[/color]avatar_size[color=#808030; ],[/color] m[color=#808030; ].[/color]posts[color=#808030; ],[/color] m[color=#808030; ].[/color]aim_name[color=#808030; ],[/color] m[color=#808030; ].[/color]icq_number[color=#808030; ],[/color] m[color=#808030; ].[/color]signature[color=#808030; ],[/color] m[color=#808030; ].[/color]website[color=#808030; ],[/color] m[color=#808030; ].[/color]yahoo[color=#808030; ],[/color] m[color=#808030; ].[/color]integ_msg[color=#808030; ],[/color] m[color=#808030; ].[/color]title[color=#808030; ],[/color] m[color=#808030; ].[/color]hide_email[color=#808030; ],[/color] m[color=#808030; ].[/color]msnname[color=#808030; ],[/color] m[color=#808030; ].[/color]warn_level[color=#808030; ],[/color] m[color=#808030; ].[/color]warn_lastwarn[color=#808030; ],[/color] m[color=#808030; ].[/color]location[color=#808030; ],[/color] g[color=#808030; ].[/color]g_id[color=#808030; ],[/color] g[color=#808030; ].[/color]g_title[color=#808030; ],[/color] g[color=#808030; ].[/color]g_icon[color=#808030; ],[/color] m[color=#808030; ].[/color]rep[color=#808030; ],[/color] g[color=#808030; ].[/color]g_dohtml FROM ib_posts p LEFT JOIN ib_members m ON [color=#808030; ]([/color] p[color=#808030; ].[/color]author_id [color=#808030; ]=[/color] m[color=#808030; ].[/color]id [color=#808030; ])[/color] LEFT JOIN ib_groups g ON [color=#808030; ]([/color] g[color=#808030; ].[/color]g_id [color=#808030; ]=[/color] m[color=#808030; ].[/color]mgroup [color=#808030; ])[/color] WHERE p[color=#808030; ].[/color]topic_id [color=#808030; ]=[/color] [color=#008c00; ]24719[/color] AND p[color=#808030; ].[/color]queued [color=#808030; ]![/color][color=#808030; ]=[/color] [color=#008c00; ]1[/color] ORDER BY p[color=#808030; ].[/color]pid LIMIT [color=#008c00; ]0[/color] [color=#808030; ],[/color] [color=#008c00; ]25[/color]
Created with colorer-take5 library. Type 'sql'


Результат:
table  type    possible[color=#808030; ]_[/color]keys  key    key[color=#808030; ]_[/color]len ref        rows    Extra  p      ref    topic[color=#808030; ]_[/color]id    topic[color=#808030; ]_[/color]id    [color=#008c00; ]4[/color]      const      [color=#008c00; ]9[/color]      Using where[color=#808030; ];[/color] Using filesort m      eq[color=#808030; ]_[/color]ref  PRIMARY    PRIMARY    [color=#008c00; ]3[/color]      p[color=#008c00; ].[/color]author[color=#808030; ]_[/color]id [color=#008c00; ]1[/color]      g      eq[color=#808030; ]_[/color]ref  PRIMARY    PRIMARY    [color=#008c00; ]4[/color]      m[color=#008c00; ].[/color]mgroup    [color=#008c00; ]1[/color]
Created with colorer-take5 library. Type 'text'


Мне это ни о чём не говорит
 
+
-
edit
 

Mishka

модератор
★★★

Я бы сделал следущее для оптимизации показанного SQL-a - добавил бы ключ
1. Если queued остается практически постоянным, то queued, topic_id, pid. Это вариант кластеризации.
2. Если он меняется часто, то topic_id, pid (или topic_id, pid, queued - но это врядли сильно поможет).

Плюсы и минусы этого подхода - сортировка уйдет - это плюс. План будет следовать ключу, поэтому сортировка и уйдет. Это ускорит чтение и показ. Да, еще и ORDER можно будет убрать, если ключ будет (topic_id, pid) - проблемы с ORDER таковы, что даже, если и хочешь показать первые N записей, SQL должен выполниться до конца, потом отсортироваться, а потом будут выбраны первые N записей. При наличии вышеуказанного ключа, порядок сортировки будет естесственным. Поэтому и сортировка уйдет.

Но база будет немного больше вздрагивать при каждом посте - надо индекс перестраивать. Но, т.к. pid постоянно растет, то вздрагивание будет не сильное. Это минус.

В самом SQL я не вижу выборку полей source и post - где они? Поскольку с source ты работаешь только при редактировании, то я бы определенно убрал бы их в отдельную таблицу. Хотя, это сильно зависит от того, как это дело реализованно в MySQL - в большинстве баз поля BLOB и TEXT сделаны как ссылки (числа) в специальные области, т.е. по сути, они уже вынены в отдельную таблицу. Если это справедливо в MySQL, то выносить в отдельную таблицу не имеет смысла.

Интересно было бы посмотреть на те SQL, которые двигают посты и форумы. Как я понимаю, подвижка форума/темы состоит в обновлении поля forum_id, topic_id?


Для Информикса (7.хх и 9.хх) было выяснено, что при больших таблицах, многих индексах (ключей) и значительных объемах обновлений легче дропнуть ключи, произвести изменение/пополнение/удаление, а потом перестроить ключи, нежели, чем все это дело делать на ходу. Таблица, естесственно локировалась на время операции.
 
+
-
edit
 

Mishka

модератор
★★★

Ром, не пробовал добавить индекс (topic_id, pid) и посмотреть что получиться?
 
+
-
edit
 

Balancer

администратор
★★★★★
А есть ли смысл делать индекс на числа?

Кроме того - временный отбой воздушной тревоги.
Основные тормоза были не из-за форума, а из-за АвиаТОПа.
Там была таблица доступа по URL, так вот, под конец там было ~140тыс. строк, индексируемых по VARCHAR. Создание индекса, естественно, было, но малоэффективно. Оставил сохранение сейчас только страниц последней недели, это около 30тыс. строк. Авиабаза стала тормозить куда как меньше
 
+
-
edit
 

Mishka

модератор
★★★

Не по числу, а по двум. А смысл есть. Смотри, что получается - для того, чтобы выполнить твой запрос с ORDER приходится пробегать всю таблицу - не ключа. Потом еще и сортировать. И только потом выдавать первые N строк. А ключ уже отсортирован. Система об этом знает и идет по записям в порядке ключа - никакой сортировки и выберуться только действительно N записей. При количестве записей в 300000 количество операций можешь оценить сам. Про это и explain говорит - в колонке ключа.
 
+
-
edit
 

Balancer

администратор
★★★★★
Mishka, 11.02.2004 20:37:19:
Ром, не пробовал добавить индекс (topic_id, pid) и посмотреть что получиться?
 

Пошёл генерить. Только непонятно, как проверить эффект
 
+
-
edit
 

Balancer

администратор
★★★★★
Тьфу, блин...

mysql[color=#808030; ]>[/color] ALTER TABLE `ib[color=#808030; ]_[/color]posts` ADD INDEX [color=#808030; ]([/color] `topic[color=#808030; ]_[/color]id` [color=#808030; ],[/color] `pid` [color=#808030; ])[/color][color=#808030; ];[/color] ERROR [color=#008c00; ]3[/color][color=#808030; ]:[/color] Error writing file [color=#0000e6; ]'/tmp/STjZgyeP'[/color] [color=#808030; ]([/color]Errcode[color=#808030; ]:[/color] [color=#008c00; ]28[/color][color=#808030; ])[/color] [color=#808030; ][[/color]root@airbase conf[color=#808030; ]][/color]# df [color=#808030; ]-[/color]m [color=#808030; ]/[/color]tmp Filesystem          1M[color=#808030; ]-[/color]blocks      Used Available Use[color=#808030; ]%[/color] Mounted on [color=#808030; ]/[/color]dev[color=#808030; ]/[/color]sda5                  [color=#008c00; ]372[/color]      [color=#008c00; ]126[/color]      [color=#008c00; ]227[/color]  [color=#008c00; ]36[/color][color=#808030; ]%[/color] [color=#808030; ]/[/color]
Created with colorer-take5 library. Type 'text'


Надо tmp куда-то временно перебрасывать будет. Теперь уже в другой раз, а то итак народ минут 40 мучался
 
+
-
edit
 

Balancer

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

code mysql
  1. # Query_time: 16  Lock_time: 0  Rows_sent: 15  Rows_examined: 360
  2. SELECT pid FROM ib_posts WHERE topic_id=19938 and queued=0 ORDER BY post_date asc LIMIT 0,15;
  3.  
  4. # Query_time: 25  Lock_time: 0  Rows_sent: 50  Rows_examined: 353
  5. SELECT * FROM ib_posts WHERE topic_id=21351 AND queued <> 1 ORDER BY pid LIMIT 50,50;
  6.  
  7. # Query_time: 17  Lock_time: 0  Rows_sent: 15  Rows_examined: 1268
  8. SELECT pid FROM ib_posts WHERE topic_id=25081 and queued=0 ORDER BY post_date asc LIMIT 450,15;
  9.  
  10. # Query_time: 13  Lock_time: 0  Rows_sent: 15  Rows_examined: 591
  11. SELECT pid FROM ib_posts WHERE topic_id=26698 and queued=0 ORDER BY post_date asc LIMIT 0,15;


И т.п. 10..20 секунд на простейший запрос. Не всегда, но часто.
Поле topic_id, понятно, индексировано.
Всего записей - скоро быдет 400 тыс.
Буфера сортировки:
code text
  1. sort_buffer_size = 2M
  2. myisam_sort_buffer_size = 64M


EXPLAIN ничего не даст, понятно, тут не в логике запроса искать надо:

EXPLAIN SELECT pid FROM ib_posts WHERE topic_id=26698 and queued=0 ORDER BY post_date asc LIMIT 0,15;

±---+-------------+----------+------+---------------+----------+---------+-------------+------+-----------------------------+
| id | select_type | table    | type | possible_keys | key      | key_len | ref        | rows | Extra                      |
±---+-------------+----------+------+---------------+----------+---------+-------------+------+-----------------------------+
|  1 | SIMPLE      | ib_posts | ref  | topic_id      | topic_id |      5 | const,const | 1247 | Using where; Using filesort |
±---+-------------+----------+------+---------------+----------+---------+-------------+------+-----------------------------+
1 row in set (0,17 sec)



Есть мысли куда копать, кроме глобального апгрейда железа? :)
 
Это сообщение редактировалось 30.07.2004 в 15:53
RU slipstream #30.07.2004 19:03
+
-
edit
 

slipstream

втянувшийся
// mysql
Вопросы по MySQL
Все-таки требуется помощь по MySQL
А!!! Спасите!!!! :D
Поставил ограничение по загрузке процессора
Технические детали Авиабазы


>..
> Поле topic_id, понятно, индексировано.

И какая же структура этой таблицы после предыдущих оптимизаций? У меня другая мысль первой была — проиндексировано ли что-нибудь кроме topic_id, например queued? ;)
RU Balancer #30.07.2004 19:08  @slipstream#30.07.2004 19:03
+
-
edit
 

Balancer

администратор
★★★★★
slipstream>*// mysql*

Дык, вопрос чаще уходит не в ту степь. Хотя, может, и подклею тему куда-нить.

slipstream>И какая же структура этой таблицы после предыдущих оптимизаций?

code mysql
  1. |CREATE TABLE `ib_posts` (
  2.   `append_edit` tinyint(1) default '0',
  3.   `edit_time` int(10) default NULL,
  4.   `pid` int(10) NOT NULL auto_increment,
  5.   `ubb_topic` varchar(11) default NULL,
  6.   `ubb_post` int(11) default '0',
  7.   `post` text NOT NULL,
  8.   `author_id` mediumint(8) NOT NULL default '0',
  9.   `author_name` varchar(32) default NULL,
  10.   `use_sig` tinyint(1) NOT NULL default '0',
  11.   `use_emo` tinyint(1) NOT NULL default '0',
  12.   `ip_address` varchar(16) NOT NULL default '',
  13.   `post_date` int(10) NOT NULL default '0',
  14.   `icon_id` smallint(3) default NULL,
  15.   `queued` tinyint(1) NOT NULL default '0',
  16.   `topic_id` int(10) NOT NULL default '0',
  17.   `post_title` varchar(255) default NULL,
  18.   `new_topic` tinyint(1) default '0',
  19.   `edit_name` varchar(255) default NULL,
  20.   `post_type` varchar(4) default NULL,
  21.   `post_parent` int(10) NOT NULL default '0',
  22.   `post_key` varchar(32) NOT NULL default '0',
  23.   `post_htmlstate` smallint(1) NOT NULL default '0',
  24.   PRIMARY KEY  (`pid`),
  25.   KEY `pid` (`pid`),
  26.   KEY `topic_id` (`topic_id`,`queued`,`pid`),
  27.   KEY `author_id` (`author_id`,`topic_id`),
  28.   KEY `post_date` (`post_date`)


slipstream>У меня другая мысль первой была — проиндексировано ли что-нибудь кроме topic_id, например queued? ;)[»]

Разве что, кроме триады `topic_id`,`queued`,`pid` добавить парный индекс `topic_id`,`queued`, но, ИМХО, не сильно поможет :)
 
+
-
edit
 

Balancer

администратор
★★★★★
Параллельный вопрос. Как переделать запрос вида
code mysql
  1. SELECT `url` FROM `avia_top_pages` ORDER BY RAND() LIMIT 100;

Т.е. выбрать из таблицы сотню случайных записей (с не идущими подряд идентификаторами).
А то, хотя этот запрос встречается редко, и на скорость форумов не влияет, но по 40 секунд ожидания не очень приятны :) (70+ тыс. строк)
 

Rada

опытный

Balancer>А есть ли смысл делать индекс на числа?

Если планируешь часто пересекать таблицы по эти полям, то имеет. Время пересечения падает с O(N2) до O(N ln(N)).

Вообще, индексируй числовые ID поля - для них в БД всегда сделаны самые эффективные реализации поиска/сортировки.
С себя можно начать когда все остальное будет в порядке.  
+
-
edit
 

Balancer

администратор
★★★★★
Balancer>>А есть ли смысл делать индекс на числа?
Rada>Если планируешь часто пересекать таблицы по эти полям, то имеет.

Да я давно этот вопросу писал :)
Просто тогда думал, что в MySQL числовые записи сортированы. Типа, индексированы по умолчанию :) Но потом научился играть с EXPLAIN :)
 
RU slipstream #31.07.2004 05:43
+
-
edit
 

slipstream

втянувшийся
> Дык, вопрос чаще уходит не в ту степь. Хотя, может, и подклею тему куда-нить

Да ну, можно было и не переносить ;) это я так для себя отметил где предыдущие темы по оптимизации были, пока авиабазовский поиск на нужную глубину не работает.

> Разве что, кроме триады `topic_id`,`queued`,`pid` добавить парный индекс `topic_id`,`queued`, но, ИМХО, не сильно поможет

Варианты — в существующий индекс topic_id добавить поле post_date (тогда в explain для WHERE topic_id .. AND queued .. ORDER BY post_date появится Using index), или наверняка сработет более простой способ — добавить в запрос прямое указание USE INDEX (post_date).

А для .. ORDER BY pid какой explain? И какой будет на точно таком же запросе, если выбирать не *, а только pid?

>Параллельный вопрос. Как переделать запрос вида
>SELECT `url` FROM `avia_top_pages` ORDER BY RAND() LIMIT 100;
..
>по 40 секунд ожидания не очень приятны (70+ тыс. строк)

Оно медленное потому как Using temporary, т.е. сбрасывает всё в новую таблицу и сортирует её. Хотел было
предложить генерировать сто идентификаторов снаружи и передавать через WHERE id=N0 or id=N1 .., ан смотрю нету в той базе числовых id ;)
1 2 3

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru