|
|
|
| Данный скрипт вызывает большую нагрузку на сервер:
<?
...
$result = sql_query("select news_id, news_title, news_date, news_start_text from news where news_enabled='1' order by news_id DESC limit 0,7", $dbi);
...
?>
|
Как можно уменьшить нагрузку на сервер? | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 00:17)
| | 1) А если взять этот запрос и выполнить в консольном клиенте mysql - сколько времени расходуется на его выполнение (клиент сообщит время в секнудах)?
2) Таблица news большая? Сколько записей и сколько мегабайт занимает? | |
|
|
|
|
|
|
|
для: cheops
(26.03.2007 в 01:16)
| | вот данный при выполнении на хостинге
Время исполнения, секунд - 13
Кол-во просмотренных строк - 128173
База большая примерно 250 мб.
И зачем просматривать столько строк, мне нужны последние 7 | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 01:20)
| | Это именно таблица news содержит 250 Мб и 128173 записей ?! А там все записи нужны? Может часть лучше переместить в другую, архивную таблицу или вообще удалить? Какого рода информация хранится в таблице news?
PS Таблица проиндексирована по полю news_id? | |
|
|
|
|
|
|
|
для: cheops
(26.03.2007 в 01:35)
| | В таблице хранится текстовая информация, и данные все нужны.
И таблица проиндексирована по полю news_id | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 01:39)
| | А разбить таблицу нельзя на несколько? | |
|
|
|
|
|
|
|
для: cheops
(26.03.2007 в 03:04)
| | Разбить данную таблицу нельзя!
Я не пойму, если мне нужны последние 7 новостей, неужели при этом запрос должен просматривать всю таблицу? | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 11:51)
| | нету в таблицах ни первых, ни последних записей.
Вы укажите в условии WHERE news_id > .... - тогда сервер будет знать, откуда танцевать.
Хотя разумнее, если к последним идет львиная доля обращений, либо разбить таблицу на две, либо продублировать срез в еще одной. | |
|
|
|
|
|
|
|
для: Trianon
(26.03.2007 в 12:12)
| | Выходит что данный запрос оптимальный. и улучшить его нельзя | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 19:56)
| | Что показывает EXPLAIN SELECT .... ? | |
|
|
|
|
|
|
|
для: Trianon
(26.03.2007 в 20:04)
| | >Что показывает EXPLAIN SELECT .... ?
непонял что за EXPLAIN? | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 22:51)
| | Попробуйте выполнить
explain select news_id, news_title, news_date, news_start_text
from news
where news_enabled='1'
order by news_id DESC
limit 0,7
|
в клиенте (phpMyAdmin например) и поглядите что получится.
Это запрос отчета эффективности указаного запроса.
Интересно, что будет в колонке Type | |
|
|
|
|
|
|
|
для: Trianon
(27.03.2007 в 00:37)
| | В колонке type -> ref
и что это значит? | |
|
|
|
|
|
|
|
для: dima_s_d_s
(27.03.2007 в 01:58)
| | Странно... У меня Ваш результат промоделировать не получается. У меня там index значится.
Надо смотреть структуру таблицы и полный ответ explain.
Хотя, в принципе, удивляться нечему. Просто катиться по индексу поля порядка не получается, поскольку нужно доп.поле в записи проверять. Ограничения на id нету. Хочешь не хочешь, а придется все записи просматривать.
В целом ведикт остается прежним. Оптимум запроса вытягивать глупо - нужно менять схему БД. | |
|
|
|
|
|
|
|
для: Trianon
(27.03.2007 в 09:22)
| | Может можно в таблице создать дополнительно поле (например индекс), как можно исправить данное положение? | |
|
|
|
|
|
|
|
для: dima_s_d_s
(27.03.2007 в 12:18)
| | У вас news_enabled какие значения может принимать? | |
|
|
|
|
|
|
|
для: cheops
(27.03.2007 в 13:27)
| | Вот структура таблици:
TABLE `news` (
`news_id` int(11) unsigned NOT NULL auto_increment,
`news_title` varchar(255) NOT NULL default '',
`news_keywords` varchar(255) NOT NULL default '',
`news_description` varchar(255) NOT NULL default '',
`news_date` datetime NOT NULL default '0000-00-00 00:00:00',
`news_start_text` text,
`news_end_text` text,
`news_comments_counter` int(11) unsigned NOT NULL default '0',
`news_hit_counter` int(11) unsigned NOT NULL default '0',
`news_topic_id` int(11) unsigned NOT NULL default '1',
`news_author` varchar(255) NOT NULL default '',
`news_enabled` tinyint(1) unsigned NOT NULL default '1',
`news_show_in_home` tinyint(1) unsigned NOT NULL default '1',
`news_allow_comments` tinyint(1) unsigned NOT NULL default '1',
`news_with_poll` tinyint(1) unsigned NOT NULL default '0',
`news_poll_id` int(11) unsigned NOT NULL default '0',
`news_auto_br` tinyint(1) unsigned NOT NULL default '1',
`news_rate_value` int(10) unsigned NOT NULL default '0',
`news_rate_count` int(10) unsigned NOT NULL default '0',
`id_alf` text NOT NULL,
PRIMARY KEY (`news_id`),
KEY `news_enabled` (`news_enabled`),
KEY `news_topic_id` (`news_topic_id`),
KEY `news_show_in_home` (`news_show_in_home`),
KEY `news_author` (`news_author`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=cp1251;
Можно её оптимизировать?
(второстипенный вопрос: как правильно орагнизовать поиск в такой большой базе? ) | |
|
|
|
|
|
|
|
для: dima_s_d_s
(26.03.2007 в 01:39)
| | >В таблице хранится текстовая информация, и данные все нужны.
>И таблица проиндексирована по полю news_id
Ну значит индек не удачный!
Вы вот что план выполнения запроса гляньте.
Если не знакомы с этим то определите селективно ли ваше условие, то есть сколько у вас строк с условием вашим enabled = 'значение' если много то индекс уберите в этом случае полное сканирвание лучше | |
|
|
|