Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизация запросов к базе 
:(
    Опции темы
kshyms
Дата 31.12.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



Цитата

Ваши запросы к базе данных не являются оптимальными, они вызывают нагрузку на сервер баз данных, так 
как запрос обрабатывает слишком большое количество строк и выполняются очень долго (в среднем 10 секунд). 
Оптимизированные запросы к базе данных обрабатываются миллисекунды.
 Это мой провайдер мне сообщил! Это результат. А что для этого надо? У меня в базе каталога 34000 строки и 10 полей  Может на perl перевести для быстроты ?  smile 

Это сообщение отредактировал(а) kshyms - 31.12.2008, 17:59
PM MAIL WWW Skype   Вверх
MystDeim
Дата 31.12.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 22.10.2007
Где: Россия->Юбилей ный

Репутация: нет
Всего: нет



Причём здесь перл, если Вам говорят про запросы к базе данных?
Попробуйте сделать кэширование страниц или каких-то данных, которые требуют сложной обработки.
--------------------
Учебные материалы для студентов http://studlab.org
PM MAIL WWW   Вверх
bars80080
Дата 31.12.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(kshyms @  31.12.2008,  14:39 Найти цитируемый пост)
Может на perl перевести для быстроты ?    

лучше привести примеры своих запросов, учитывая сколько они оттягивают ресурсов и в самом деле оптимизировать их


PM MAIL WWW   Вверх
kshyms
Дата 31.12.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



вопрос решен

Это сообщение отредактировал(а) kshyms - 30.1.2009, 11:44
PM MAIL WWW Skype   Вверх
krundetz
Дата 31.12.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



kshyms, то что ты привел конечно интересно, но не мог бы ты сам вытащить из своего кода sql запросы, привести структуру таблицы и пояснить что каким запросом пытаешься вытащить, как потом результат используешь и почему именно так. Это поможет людям быстрее понять что у тебя возможно оптимизировать и дать дельный совет.
Код

        $rr=mysql_query("SELECT count(*) FROM main WHERE type=1 AND ($likes)") or die(mysql_error());
        $total=mysql_result($rr,0,0);
        $r=mysql_query("SELECT * FROM main WHERE type=1 AND ($likes) $order LIMIT $start,10") or die(mysql_error());

сдесь явная избыточность, в первом запросе количество строк в таблице считай не по всем полям, а по какому нибудь одному.
Код

SELECT count(имя_индексируемого_поля) FROM main WHERE type=1 AND ($likes)

аналогично оптимизировать это
Код

if ($best!=1)return(mysql_result(mysql_query("SELECT count(*) FROM main WHERE type=1 $bestsql AND (cat1=$cid OR cat2=$cid OR cat3=$cid);"),0,0));

да не увидел у тебя защиту от SQL-инекций

Это сообщение отредактировал(а) krundetz - 31.12.2008, 18:15


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
kshyms
Дата 1.1.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



Я понял надо загружать не все подряд, а только то, что надо! Это и будет оптимизацией запросов к базе...

Это сообщение отредактировал(а) kshyms - 1.1.2009, 16:45
PM MAIL WWW Skype   Вверх
taral
Дата 1.1.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Цитата

сдесь явная избыточность, в первом запросе количество строк в таблице считай не по всем полям, а по какому нибудь одному.

На сколько я знаю нужно наоборот count(*) делать для оптимизации.
Поскольку так оно считает только строки в таблице, не выбирая значения вообще.
А если считать по конкретному столбцу, то сначала выбираются значения не нулевые и возвращается их количество.
Потому запрос
Код

SELECT COUNT(*) ...

Будет быстрее чем
Код

SELECT COUNT(id_key) ...

PM MAIL   Вверх
krundetz
Дата 1.1.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



taral, может ты и прав надо поэкспирементировать, но вродебы вариант который я привел вооще не считает строки а берет их количество из индекса


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
kshyms
Дата 2.1.2009, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



Здесь вычитал про оптимизацию а может limit для загрузки строк применить и разбить таблицу на несколько частей и по очереди как новый запрос загружать и еще лишние поля убрать которые не используются?
А может заменить SELECT COUNT(*) ... на select_expression (Выражение select_expression задает столбцы, в которых необходимо проводить выборку) будет ли быстрее работать?

Это сообщение отредактировал(а) kshyms - 2.1.2009, 08:10
PM MAIL WWW Skype   Вверх
egrik
Дата 2.1.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 10.11.2006
Где: Voronezh

Репутация: нет
Всего: 1



Нет никакого желания разбираться в каше приведенного вами выше кода. Но, а может быть будет достаточно выставить индексы на таблицах? Покажите структуру базы данных.
PM MAIL ICQ Skype   Вверх
taral
Дата 5.1.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Цитата

А может заменить SELECT COUNT(*) ... на select_expression (Выражение select_expression задает столбцы, в которых необходимо проводить выборку) будет ли быстрее работать?

Я уверен что нет.
Цитата

может limit для загрузки строк применить

А ты его что совсем не применял?
Цитата

разбить таблицу на несколько частей и по очереди как новый запрос загружать

Если ты имеешь в виду разбить таблицу на несколько таких же то могу сказать вот что. НИКОГДА ДАЖЕ НЕ ДУМАЙ так делать. Это вообще сумасшествие какое то...
Цитата

еще лишние поля убрать которые не используются

Определенно да.
PM MAIL   Вверх
krundetz
Дата 5.1.2009, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(taral @  5.1.2009,  00:19 Найти цитируемый пост)
Если ты имеешь в виду разбить таблицу на несколько таких же то могу сказать вот что. НИКОГДА ДАЖЕ НЕ ДУМАЙ так делать. Это вообще сумасшествие какое то...

не совсем понял данное высказывание.
Если у нас таблица скажем на 100000 строк и постоянно мы оперируем только 1000 последних, то само по себе напрашивается разделение таблицы на две постоянно запрашиваемых и обновляемых данных и архивной где данные обновляются и запрашиваются крайне редко!


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
taral
Дата 5.1.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Цитата

Если у нас таблица скажем на 100000 строк и постоянно мы оперируем только 1000 последних, то само по себе напрашивается разделение таблицы на две постоянно запрашиваемых и обновляемых данных и архивной где данные обновляются и запрашиваются крайне редко!

kshyms говорил про 34000 полей.
На моем компьютере, который не ровня серверам, запрос на выборку из 40 000 меньше секунды уходит. А он говорил про 10 сек.
Про разбивание таблиц с его слов я понял что он хочет на несколько разбивать (больше 2)
Смысл в разбиении таблицы на 2 я вижу в том случае если 2-я это сбор всех данных. В 1-ю мы добавляем новые. И периодически из 1-й мы переводим данные во 2-ю. Это уменьшает нагрузку. Поскольку затрагивается основная база не каждый раз когда происходит обновление.
Такой способ часто встречается в очень нагруженных сайтах , а именно в голосовании.
Пример таблицы в которой часть данных часто используется а основная масса нет, я на своей практике не встречал.
Меня еще заинтересовало каким образом определяется какие записи более востребованы.
Я понимаю так. У каждой ячейки есть счетчик количества запросов к ней. И если он переходит границу то запись мигрирует из главной таблицы в более используемую.
Я такого не встречал. Наведите пожалуйста примеры сайтов где используется такой способ?
Еще разденление таблици на несколько неизбежно ведет к множеству  проблем. Например поиск по сайту должен осуществятся сразу по нескольким таблицам (вместо одной) и это только вершина айсберга.
Потому разбиение на 2 таблицы я вижу только в том случае если это правда оправданный ход. И перед действием стоит очень серьезно подумать.

Это сообщение отредактировал(а) taral - 5.1.2009, 01:49
PM MAIL   Вверх
krundetz
Дата 5.1.2009, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(taral @  5.1.2009,  01:45 Найти цитируемый пост)
Пример таблицы в которой часть данных часто используется а основная масса нет, я на своей практике не встречал.

финансовые данные, работа с данными отчетного периода
трейдерские данные, опят же периодичность работы с данными
новости
Цитата(taral @  5.1.2009,  01:45 Найти цитируемый пост)
Меня еще заинтересовало каким образом определяется какие записи более востребованы.
Я понимаю так. У каждой ячейки есть счетчик количества запросов к ней. И если он переходит границу то запись мигрирует из главной таблицы в более используемую.

Востребованность данных определяется временным периодом, и по нему же определяется где должны находиться эти данные либо в основной таблице либо в архивной.
Цитата(taral @  5.1.2009,  01:45 Найти цитируемый пост)
На моем компьютере, который не ровня серверам, запрос на выборку из 40 000 меньше секунды уходит. А он говорил про 10 сек.

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


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
theworldcreator
Дата 5.1.2009, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



Цитата

Пример таблицы в которой часть данных часто используется а основная масса нет, я на своей практике не встречал.

Чат?..
Архивные данные для восстановления справедливости в конфликтных ситуациях.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.