Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: При выполнении скрипта большая нагрузка на сервер
 
 автор: dima_s_d_s   (26.03.2007 в 00:17)   письмо автору
 
 

Данный скрипт вызывает большую нагрузку на сервер:


<?
...

$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);

...
?>


Как можно уменьшить нагрузку на сервер?

   
 
 автор: cheops   (26.03.2007 в 01:16)   письмо автору
 
   для: dima_s_d_s   (26.03.2007 в 00:17)
 

1) А если взять этот запрос и выполнить в консольном клиенте mysql - сколько времени расходуется на его выполнение (клиент сообщит время в секнудах)?
2) Таблица news большая? Сколько записей и сколько мегабайт занимает?

   
 
 автор: dima_s_d_s   (26.03.2007 в 01:20)   письмо автору
 
   для: cheops   (26.03.2007 в 01:16)
 

вот данный при выполнении на хостинге

Время исполнения, секунд - 13
Кол-во просмотренных строк - 128173

База большая примерно 250 мб.

И зачем просматривать столько строк, мне нужны последние 7

   
 
 автор: cheops   (26.03.2007 в 01:35)   письмо автору
 
   для: dima_s_d_s   (26.03.2007 в 01:20)
 

Это именно таблица news содержит 250 Мб и 128173 записей ?! А там все записи нужны? Может часть лучше переместить в другую, архивную таблицу или вообще удалить? Какого рода информация хранится в таблице news?

PS Таблица проиндексирована по полю news_id?

   
 
 автор: dima_s_d_s   (26.03.2007 в 01:39)   письмо автору
 
   для: cheops   (26.03.2007 в 01:35)
 

В таблице хранится текстовая информация, и данные все нужны.
И таблица проиндексирована по полю news_id

   
 
 автор: cheops   (26.03.2007 в 03:04)   письмо автору
 
   для: dima_s_d_s   (26.03.2007 в 01:39)
 

А разбить таблицу нельзя на несколько?

   
 
 автор: dima_s_d_s   (26.03.2007 в 11:51)   письмо автору
 
   для: cheops   (26.03.2007 в 03:04)
 

Разбить данную таблицу нельзя!
Я не пойму, если мне нужны последние 7 новостей, неужели при этом запрос должен просматривать всю таблицу?

   
 
 автор: Trianon   (26.03.2007 в 12:12)   письмо автору
 
   для: dima_s_d_s   (26.03.2007 в 11:51)
 

нету в таблицах ни первых, ни последних записей.
Вы укажите в условии WHERE news_id > .... - тогда сервер будет знать, откуда танцевать.
Хотя разумнее, если к последним идет львиная доля обращений, либо разбить таблицу на две, либо продублировать срез в еще одной.

   
 
 автор: dima_s_d_s   (26.03.2007 в 19:56)   письмо автору
 
   для: Trianon   (26.03.2007 в 12:12)
 

Выходит что данный запрос оптимальный. и улучшить его нельзя

   
 
 автор: Trianon   (26.03.2007 в 20:04)   письмо автору
 
   для: dima_s_d_s   (26.03.2007 в 19:56)
 

Что показывает EXPLAIN SELECT .... ?

   
 
 автор: dima_s_d_s   (26.03.2007 в 22:51)   письмо автору
 
   для: Trianon   (26.03.2007 в 20:04)
 

>Что показывает EXPLAIN SELECT .... ?
непонял что за EXPLAIN?

   
 
 автор: Trianon   (27.03.2007 в 00:37)   письмо автору
 
   для: 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

   
 
 автор: dima_s_d_s   (27.03.2007 в 01:58)   письмо автору
 
   для: Trianon   (27.03.2007 в 00:37)
 

В колонке type -> ref

и что это значит?

   
 
 автор: Trianon   (27.03.2007 в 09:22)   письмо автору
 
   для: dima_s_d_s   (27.03.2007 в 01:58)
 

Странно... У меня Ваш результат промоделировать не получается. У меня там index значится.
Надо смотреть структуру таблицы и полный ответ explain.

Хотя, в принципе, удивляться нечему. Просто катиться по индексу поля порядка не получается, поскольку нужно доп.поле в записи проверять. Ограничения на id нету. Хочешь не хочешь, а придется все записи просматривать.

В целом ведикт остается прежним. Оптимум запроса вытягивать глупо - нужно менять схему БД.

   
 
 автор: dima_s_d_s   (27.03.2007 в 12:18)   письмо автору
 
   для: Trianon   (27.03.2007 в 09:22)
 

Может можно в таблице создать дополнительно поле (например индекс), как можно исправить данное положение?

   
 
 автор: cheops   (27.03.2007 в 13:27)   письмо автору
 
   для: dima_s_d_s   (27.03.2007 в 12:18)
 

У вас news_enabled какие значения может принимать?

   
 
 автор: dima_s_d_s   (27.03.2007 в 18:40)   письмо автору
 
   для: 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;

Можно её оптимизировать?

(второстипенный вопрос: как правильно орагнизовать поиск в такой большой базе? )

   
 
 автор: Граон   (28.03.2007 в 15:15)   письмо автору
 
   для: dima_s_d_s   (26.03.2007 в 01:39)
 

>В таблице хранится текстовая информация, и данные все нужны.
>И таблица проиндексирована по полю news_id

Ну значит индек не удачный!
Вы вот что план выполнения запроса гляньте.
Если не знакомы с этим то определите селективно ли ваше условие, то есть сколько у вас строк с условием вашим enabled = 'значение' если много то индекс уберите в этом случае полное сканирвание лучше

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования