Оптимизация запросов

12
[Удален]
1061

Мужки все привет. Ктонить может оптимизировать запросы к базе? самому не посилам так как чёто сложноватые они, а жирут огого скока ресурсов. Вот собственно весь функционал с коментариями. Если кого не затруднит глянте пожалуйста.

zip functions.zip
N
На сайте с 15.08.2007
Offline
5
#1

Глянули... Из 17кб кода запросов там, прямо скажем, совсем немного... Оптимизировать запросы это одно, а копать фрагмент кода, который непонятно к чему цеплять и вообще как он работает - это совсем другое.

Кстати, а как Вы себе представляете оптимизацию запросов без исходных данных (структуры таблиц и собственно записей)?

denis716
На сайте с 12.09.2007
Offline
115
#2

Без структуры таблиц сложно что-либо посоветовать, но бросилось в глаза два момента:

1.

// get list of categories

$sql = "
SELECT * $count_ext
FROM pqdb_categories, pqdb_articles
WHERE category_id > 0
AND category_id = article_cat
$query_ext
GROUP BY category_id
ORDER BY category_name ASC";

Звездочку лучше заменить списком имен полей, которые нужны в данном контексте, предположительно это: category_desc, category_id, category_name

2.

$cat_id_ext = " WHERE category_name = '" . mysql_real_escape_string($category_name) . "' ";

Очевидно, добавляется условие поиска по текстовому полю category_name. Если это действительно необходимо, то нужно в таблице добавить индекс по этому полю. Скорость запроса заметно возрастет.

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#3
KosoyRoman:
Мужки все привет. Ктонить может оптимизировать запросы к базе? самому не посилам так как чёто сложноватые они, а жирут огого скока ресурсов. Вот собственно весь функционал с коментариями. Если кого не затруднит глянте пожалуйста.

Структуру базы можете привести? Есть подозрение на сортировку большой таблицы с полем типа TEXT.

Неизменность точки зрения неизменно порождает иллюзию понимания.
DyaDya
На сайте с 11.04.2007
Offline
147
#4

Необходимо выявить, что именно жрет кучу ресурсов? Сколько запросов делается? сколько времени уходит на выполнение каждого запроса? Какая структура таблиц? Сколько записей в таблицах?

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

Иногда, достаточно немного поколдовать с типами и ключами в таблицах для решения проблемы. А бывает, что нужно и практически все переделывать. По вашему кусочку кода сразу не угадаешь.

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
Dreammaker
На сайте с 20.04.2006
Offline
569
#5

присоединюсь к телепатам. :)

вот эта строка может добавлять " AND category_id IN ($selected_categories)" проблем, но в случае если категорий много.

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

[Удален]
#6
Слава Шевцов:
Структуру базы можете привести? Есть подозрение на сортировку большой таблицы с полем типа TEXT.

пожалуйста

zip www.zip
[Удален]
#7

база весит порядка 250метров в ней около 50000 статей 148 категорий

Dreammaker
На сайте с 20.04.2006
Offline
569
#8

Для начала поставьте индекс на поле article_cat в таблице pqdb_articles

Если не поможет будем смотреть дальше.

Update: Мой совет нужен, но проблема не в этом. Частично прав Слава Шевцов - там идёт сортировка по RAND() , что и приводит к тормозам.

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#9
KosoyRoman:
пожалуйста

Значит так. В обеих таблицах есть поля типа mediumtext. При этом в ряде запросов происходит слияние таблиц и последующая сортировка. При слиянии и сортировке таблиц с извлечением mediumtext данных, вся новая таблица кладётся на диск и забирается оттуда. Отсюда и тормоза - из-за чтения-записи на диск всей таблицы.

Оптимизируется так: разбиваете каждую Вашу таблицу на две. В одной есть mediumtext поля, в другой нет. Сортируете слиянием только те таблицы, которые не имеют mediumtext полей. Затем отсылаете запросы на данные в таблицы с mediumtext полями. Запросов будет в десять раз больше, но работать будет в сотни раз быстрее.

CREATE TABLE `pqdb_articles` (

`article_id` int(11) NOT NULL auto_increment,
`article_title` varchar(255) NOT NULL default '',
`article_text` mediumtext NOT NULL,
`article_cat` mediumint(9) NOT NULL default '0',
`article_meta_key` mediumtext NOT NULL,
`article_meta_desc` mediumtext NOT NULL,
PRIMARY KEY (`article_id`)
) TYPE=MyISAM AUTO_INCREMENT=50972 ;

-- --------------------------------------------------------

--
-- Table structure for table `categories`
--

CREATE TABLE `pqdb_categories` (
`category_id` mediumint(9) NOT NULL auto_increment,
`category_name` varchar(255) NOT NULL default '',
`category_desc` varchar(255) NOT NULL default '',
`category_meta_key` mediumtext NOT NULL,
`category_meta_desc` mediumtext NOT NULL,
`category_rss` mediumtext NOT NULL,
PRIMARY KEY (`category_id`)
) TYPE=MyISAM AUTO_INCREMENT=250 ;

Должно превратиться в

CREATE TABLE `pqdb_articles` (

`article_id` int(11) NOT NULL auto_increment,
`article_title` varchar(255) NOT NULL default '',
`article_cat` mediumint(9) NOT NULL default '0',
PRIMARY KEY (`article_id`)
) TYPE=MyISAM AUTO_INCREMENT=50972 ;

CREATE TABLE `pqdb_articles_text` (
`article_id` int(11) NOT NULL default 0,
`article_text` mediumtext NOT NULL,
`article_meta_key` mediumtext NOT NULL,
`article_meta_desc` mediumtext NOT NULL,
PRIMARY KEY (`article_id`)
) TYPE=MyISAM;

-- --------------------------------------------------------

--
-- Table structure for table `categories`
--

CREATE TABLE `pqdb_categories` (
`category_id` mediumint(9) NOT NULL auto_increment,
`category_name` varchar(255) NOT NULL default '',
`category_desc` varchar(255) NOT NULL default '',
PRIMARY KEY (`category_id`)
) TYPE=MyISAM AUTO_INCREMENT=250 ;

CREATE TABLE `pqdb_categories_text` (
`category_id` mediumint(9) NOT NULL default 0,
`category_meta_key` mediumtext NOT NULL,
`category_meta_desc` mediumtext NOT NULL,
`category_rss` mediumtext NOT NULL,
PRIMARY KEY (`category_id`)
) TYPE=MyISAM;

Код бесплатно переписывать не буду - времени много займёт. Платно тоже не буду - могу лишь www.weblancer.net посоветовать.

Dreammaker
На сайте с 20.04.2006
Offline
569
#10

Слава Шевцов,

мне кажется основная проблема в


ORDER BY ". RIGHT_COLUMN_ORDER_BY . "

и


define("RIGHT_COLUMN_ORDER_BY", "RAND()"); // Sort articles Ascending by "article_title", "article_id" or "RAND()"

Ну и для левой колонки аналогично.

Два запроса с такими участками для нормальной базы могут превосходно её положить :)

KosoyRoman,

попробуйте поменять

строку в файле config.php



define("LEFT_COLUMN_ORDER_BY", "RAND()"); // Sort articles Ascending by "article_title", "article_id" or "RAND()"

на



define("LEFT_COLUMN_ORDER_BY", "article_id"); // Sort articles Ascending by "article_title", "article_id" or "RAND()"

и строку



define("RIGHT_COLUMN_ORDER_BY", "RAND()"); // Sort articles Ascending by "article_title", "article_id" or "RAND()"

на



define("RIGHT_COLUMN_ORDER_BY", "article_id"); // Sort articles Ascending by "article_title", "article_id" or "RAND()"

Если скорость возрастёт значительно - значит проблема была в случайной сортировке (испытывать на реальной базе!).

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий