0 Пользователей и 1 Гость просматривают эту тему.
  • 34 Ответов
  • 917 Просмотров
*

Wertos

  • Завсегдатай
  • 505
  • 21
Где же найти узкое место
« : 04.04.2016, 17:18:15 »
Блог категории, выводит по 20 материалов из одной категории.

0.003712 секунд
Код: php
$mtime = microtime();
$mtime = explode(" ",$mtime);
$tstart = $mtime[1] + $mtime[0];

$mysqli = new mysqli("localhost", "****", "****", "****");
$mysqli->query("a.id, a.title, a.alias, a.introtext, a.fulltext, a.checked_out, a.checked_out_time, a.catid, a.created, a.created_by, a.created_by_alias,
  CASE WHEN a.modified = '0000-00-00 00:00:00' THEN a.created ELSE a.modified END as modified, a.modified_by, uam.name as modified_by_name,
  CASE WHEN a.publish_up = '0000-00-00 00:00:00' THEN a.created ELSE a.publish_up END as publish_up,a.publish_down, a.images, a.urls, a.attribs, a.metadata, a.metakey, a.metadesc, a.access, a.hits, a.xreference, a.featured, a.language,  LENGTH(a.fulltext) AS readmore,
  CASE WHEN badcats.id is not null THEN 0 ELSE a.state END AS state,c.title AS category_title, c.path AS category_route, c.access AS category_access, c.alias AS category_alias,
  CASE WHEN a.created_by_alias > ' ' THEN a.created_by_alias ELSE ua.name END AS author,ua.email AS author_email,parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias,ROUND(v.rating_sum / v.rating_count, 0) AS rating, v.rating_count as rating_count,c.published,
  CASE WHEN badcats.id is null THEN c.published ELSE 0 END AS parents_published

  FROM j_content AS a

  LEFT JOIN j_content_frontpage AS fp
  ON fp.content_id = a.id

  LEFT JOIN j_categories AS c
  ON c.id = a.catid

  LEFT JOIN j_users AS ua
  ON ua.id = a.created_by

  LEFT JOIN j_users AS uam
  ON uam.id = a.modified_by

  LEFT JOIN j_categories as parent
  ON parent.id = c.parent_id

  LEFT JOIN j_content_rating AS v
  ON a.id = v.content_id

  LEFT
  OUTER JOIN (SELECT cat.id as id
  FROM j_categories AS cat JOIN j_categories AS parent
  ON cat.lft BETWEEN parent.lft
  AND parent.rgt
  WHERE parent.extension = 'com_content'
  AND parent.published != 1
  GROUP BY cat.id ) AS badcats
  ON badcats.id = c.id

  WHERE
  CASE WHEN badcats.id is null THEN a.state ELSE 0 END IN (0,1,2)
  AND a.catid = 209

  ORDER BY  c.path,   a.created  DESC ,  a.created  
  LIMIT 100, 120");
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$totaltime = ($mtime - $tstart);//Вычисляем разницу
printf ("%f секунд\n", $totaltime);



7.240856 секунд
Код: php
$mtime = microtime();
$mtime = explode(" ",$mtime);
$tstart = $mtime[1] + $mtime[0];

$db = JFactory::getDBO();
$qt = $db->getQuery(true)->select("a.id, a.title, a.alias, a.introtext, a.fulltext, a.checked_out, a.checked_out_time, a.catid, a.created, a.created_by, a.created_by_alias,
  CASE WHEN a.modified = '0000-00-00 00:00:00' THEN a.created ELSE a.modified END as modified, a.modified_by, uam.name as modified_by_name,
  CASE WHEN a.publish_up = '0000-00-00 00:00:00' THEN a.created ELSE a.publish_up END as publish_up,a.publish_down, a.images, a.urls, a.attribs, a.metadata, a.metakey, a.metadesc, a.access, a.hits, a.xreference, a.featured, a.language,  LENGTH(a.fulltext) AS readmore,
  CASE WHEN badcats.id is not null THEN 0 ELSE a.state END AS state,c.title AS category_title, c.path AS category_route, c.access AS category_access, c.alias AS category_alias,
  CASE WHEN a.created_by_alias > ' ' THEN a.created_by_alias ELSE ua.name END AS author,ua.email AS author_email,parent.title as parent_title, parent.id as parent_id, parent.path as parent_route, parent.alias as parent_alias,ROUND(v.rating_sum / v.rating_count, 0) AS rating, v.rating_count as rating_count,c.published,
  CASE WHEN badcats.id is null THEN c.published ELSE 0 END AS parents_published

  FROM j_content AS a

  LEFT JOIN j_content_frontpage AS fp
  ON fp.content_id = a.id

  LEFT JOIN j_categories AS c
  ON c.id = a.catid

  LEFT JOIN j_users AS ua
  ON ua.id = a.created_by

  LEFT JOIN j_users AS uam
  ON uam.id = a.modified_by

  LEFT JOIN j_categories as parent
  ON parent.id = c.parent_id

  LEFT JOIN j_content_rating AS v
  ON a.id = v.content_id

  LEFT
  OUTER JOIN (SELECT cat.id as id
  FROM j_categories AS cat JOIN j_categories AS parent
  ON cat.lft BETWEEN parent.lft
  AND parent.rgt
  WHERE parent.extension = 'com_content'
  AND parent.published != 1
  GROUP BY cat.id ) AS badcats
  ON badcats.id = c.id

  WHERE
  CASE WHEN badcats.id is null THEN a.state ELSE 0 END IN (0,1,2)
  AND a.catid = 209

  ORDER BY  c.path,   a.created  DESC ,  a.created  
  LIMIT 100, 120");
$db->setQuery($qt);
$db->execute();

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$totaltime = ($mtime - $tstart);
printf ("%f секунд\n", $totaltime);

В админке выставлено MySqli
запрос взят из отладки.
Подскажите куда смотреть ? Плагины тут не используются... Не знаю куда копать.
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #1 : 04.04.2016, 19:47:38 »
А если запустить запрос в PMA и посмотреть его как-это по-русски.. explain короче
*

Arkadiy

  • Группа развития
  • 5350
  • 440
  • Крепитесь, други.
Re: Где же найти узкое место
« Ответ #2 : 04.04.2016, 20:16:37 »
Вижу подзапрос в конце запроса, он может долго исполняться, точнее исполняться огромное количество раз.
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #3 : 04.04.2016, 20:53:21 »
Ну дак это ядро J! Это блин фиг поменяешь...
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #4 : 04.04.2016, 20:59:02 »
По сути?
Ядро какой версии?
Запрос на фронте или в бэкэнде?
Что эксплейн говорит?

При желании можно и ядро поменять
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #5 : 04.04.2016, 21:11:09 »
J! 3.5.0 - сразу скажу, что на чистой J! абсолютно точно также долго...
Я же писал что на фронте:
Цитировать
Блог категории, выводит по 20 материалов из одной категории.
Что за експлейн ? Если в дебаге, внизу, то моего разрешения экрана не хватает...
Код
Время запроса: 6293.80 ms После последнего запроса: 1.57 ms Память запроса: 0.219 MB Память до запроса: 11.491 MB Выбрано строк: 20

Код
План SQL-запросов (Explain)
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY a NULL ref idx_catid idx_catid 4 const 28435 100.00 Using temporary; Используется filesort
1 PRIMARY fp NULL eq_ref PRIMARY PRIMARY 4 ****.a.id 1 100.00 Using where; Using index
1 PRIMARY c NULL const PRIMARY,id PRIMARY 4 const 1 100.00 NULL
1 PRIMARY ua NULL eq_ref PRIMARY PRIMARY 4 ****.a.created_by 1 100.00 Using where
1 PRIMARY uam NULL eq_ref PRIMARY PRIMARY 4 ****.a.modified_by 1 100.00 Using where
1 PRIMARY parent NULL eq_ref PRIMARY,id PRIMARY 4 ****.c.parent_id 1 100.00 Using where
1 PRIMARY v NULL eq_ref PRIMARY PRIMARY 4 ****.a.id 1 100.00 Using where
1 PRIMARY <derived2> NULL ref <auto_key0> <auto_key0> 4 ****.c.id 5 100.00 Using where; Using index
2 DERIVED parent NULL range cat_idx,idx_left_right cat_idx 203 NULL 8 100.00 Using index condition; Using temporary; Используется filesort
2 DERIVED cat NULL index PRIMARY,id,cat_idx,idx_access,idx_checkout,idx_path,idx_left_right,idx_language,idx_alias idx_left_right 8 NULL 64 11.11 Using where; Using index; Using join buffer (Block Nested Loop)

Код
Профилирование SQL-запросов
Status Duration
starting 0.01 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
starting 0.00 ms
checking query cache for query 0.29 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
checking permissions 0.00 ms
Opening tables 0.04 ms
init 0.13 ms
System lock 0.01 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
System lock 0.04 ms
optimizing 0.01 ms
optimizing 0.01 ms
statistics 0.10 ms
preparing 0.02 ms
Creating tmp table 0.01 ms
Sorting result 0.02 ms
statistics 0.10 ms
preparing 0.02 ms
Creating tmp table 0.06 ms
Sorting result 0.01 ms
executing 0.01 ms
Sending data 0.16 ms
executing 0.00 ms
Sending data 0.14 ms
Creating sort index 6212.66 ms
Creating sort index 47.64 ms
Waiting for query cache lock 0.01 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.08 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.06 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.05 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.06 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.05 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.05 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
Creating sort index 0.07 ms
end 0.00 ms
query end 0.01 ms
removing tmp table 31.60 ms
query end 0.02 ms
removing tmp table 0.01 ms
query end 0.00 ms
closing tables 0.01 ms
removing tmp table 0.01 ms
closing tables 0.03 ms
freeing items 0.05 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
freeing items 0.03 ms
Waiting for query cache lock 0.00 ms
Waiting on query cache mutex 0.00 ms
freeing items 0.00 ms
storing result in query cache 0.02 ms
logging slow query 0.00 ms
logging slow query 0.22 ms
cleaning up 0.03 ms
*

robert

  • Профи
  • 4081
  • 376
Re: Где же найти узкое место
« Ответ #6 : 04.04.2016, 21:13:00 »
В целом нативный метод PHP исполняется быстрее, и это понятно, но такой большой разницы не наблюдаю.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #7 : 04.04.2016, 21:14:26 »
Цитировать
Creating sort index   6212.66 ms
Надо индекс добавить..

Так не скажу сразу по какому столбцу.
А вообще - версия мускуля какая?
Может он не создал те индексы, что прописаны?
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #8 : 04.04.2016, 21:15:14 »
Табличка content ~ 1.2Gb ! В категории порядка 30к материалов.
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #9 : 04.04.2016, 21:16:00 »
Ну вот, уже понятнее.
Коммент выше актуален
*

robert

  • Профи
  • 4081
  • 376
Re: Где же найти узкое место
« Ответ #10 : 04.04.2016, 21:17:08 »
voland, насколько я понял, Wertos делает тест на одном и том же сайте с одним и тем же запросом (иначе не было бы смысла) - стартовые условия одинаковые.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #11 : 04.04.2016, 21:18:16 »
Надо индекс добавить..

Так не скажу сразу по какому столбцу.
А вообще - версия мускуля какая?
Может он не создал те индексы, что прописаны?

Код
Сервер: local (Localhost via UNIX socket)
Тип сервера: Percona Server
Версия сервера: 5.7.11-4-log - Percona Server (GPL), Release 4, Revision 5c940e1
Версия протокола: 10
Пользователь: root@localhost
Кодировка сервера: UTF-8 Unicode (utf8)

*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #12 : 04.04.2016, 21:29:04 »
Это вообще что?
ВДСка?

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

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #13 : 04.04.2016, 21:30:50 »
Это вообще что?
ВДСка?

Попробуйте с размером кэша поиграться, увеличить его.
Похоже, что мускуль скидывает на винт временный результат
Можно чуть подробнее ? У меня конфиг такой.
Код
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
max_connections = 200
connect_timeout = 120
skip-external-locking
bind-address        = 127.0.0.1
max_allowed_packet  = 32M
thread_stack        = 512K
tmp_table_size      = 1024M
max_heap_table_size = 1024M
#myisam-recover     = BACKUP
query_cache_type    = 1
query_cache_limit   = 128M
query_cache_size    = 256M
max_binlog_size     = 16M
symbolic-links      = 0
slow_query_log      = 1
long_query_time     = 3
lc-messages         = ru_RU
language            = russian

query_cache_min_res_unit = 128

join_buffer_size = 16M
sort_buffer_size = 4M
key_buffer_size     = 16M
sort_buffer_size    = 8M
read_rnd_buffer_size = 4M

sql-mode="ALLOW_INVALID_DATES"

innodb_strict_mode = ON
innodb_buffer_pool_size = 2G
innodb_thread_concurrency = 8
#transaction-isolation = READ-COMITTED
innodb_flush_method = O_DIRECT
innodb_log_file_size = 1024M
innodb_log_buffer_size = 1024M
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_instances = 6
thread_cache_size = 16
innodb_open_files = 4096
#innodb_file_per_table = 1
innodb_data_file_path=ibdata1:1100M:autoextend:max:3G
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000

innodb_sort_buffer_size = 8M

innodb_file_format = Barracuda
innodb_file_format_max = Barracuda

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #14 : 04.04.2016, 21:34:58 »
Код
max_allowed_packet  = 32M
thread_stack        = 512K
tmp_table_size      = 1024M
max_heap_table_size = 1024M
query_cache_limit   = 128M
query_cache_size    = 256M
join_buffer_size = 16M
sort_buffer_size = 4M
key_buffer_size     = 16M
sort_buffer_size    = 8M
read_rnd_buffer_size = 4M
thread_cache_size = 16
innodb_sort_buffer_size = 8M
Не знаю, что-то из этого.
Я ж даже не знаю кодровки таблиц
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #15 : 04.04.2016, 21:35:52 »
ЗЫ. В запросе в PMA уберите LIMIT и посмотрите объем переданных данных
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #16 : 04.04.2016, 21:36:28 »
Все такие
Код
InnoDB	utf8mb4_unicode_ci
и база тоже
Код
502,490	InnoDB	utf8mb4_unicode_ci	1.4 ГиБ	
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #17 : 04.04.2016, 21:40:13 »
ЗЫ. В запросе в PMA уберите LIMIT и посмотрите объем переданных данных
А PMA сам добавляет лимит ! И галочки нет "Показать всё"
НО пишет вот что
Код
Данное выделение не содержит уникального столбца. Изменение сетки, выставление галочки, редактирование, копирование и удаление невозможно. 

ADD
Код
Отображение строк 0 - 499 (27888 всего, Запрос занял 1.6342 сек.)
Вот 500 строк выбрал
« Последнее редактирование: 04.04.2016, 21:43:38 от Wertos »
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #18 : 04.04.2016, 21:45:43 »
Ну сделать лимит 100500
И не про время спросил, а про объем данных.

ЗЗЫ. на 3.4 всё летало?
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #19 : 04.04.2016, 21:46:56 »
ЗЗЫ. на 3.4 всё летало?
Если да, и если оперативка позволяет - я бы на всё увеличил вдвое.
Так как новая кодировка вдвое более жирная
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #20 : 04.04.2016, 21:50:15 »
Ну сделать лимит 100500
И не про время спросил, а про объем данных.

ЗЗЫ. на 3.4 всё летало?
На 3.4 уже не помню...
А объём где смотреть ?
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #21 : 04.04.2016, 21:59:52 »
Хм. Хороший вопрос.
А если  сделать экспорт, посмотреть его размер и кодировку в нем?
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #22 : 04.04.2016, 22:05:40 »
Хм. Хороший вопрос.
А если  сделать экспорт, посмотреть его размер и кодировку в нем?
Дак этот экспорт будет дооолго скачиваться... ибо табличка больше гига !
Но по дампу БД скажу, что content в utf8mb4_unicode_ci
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #23 : 04.04.2016, 22:16:31 »
Экспорт в UTF-8, размер около 800мб
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #24 : 04.04.2016, 22:16:58 »
Ну то есть большая часть всей базы приходится на табличку контент?
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #25 : 04.04.2016, 22:17:35 »
Экспорт в UTF-8, размер около 800мб
Ясно
Если да, и если оперативка позволяет - я бы на всё увеличил вдвое.
Так как новая кодировка вдвое более жирная
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #26 : 04.04.2016, 22:26:30 »
Не помогает увеличение, но это возможно из за того что если и увеличивать, то надо знать что...
Оперативки 12Gb
*

robert

  • Профи
  • 4081
  • 376
Re: Где же найти узкое место
« Ответ #27 : 04.04.2016, 22:48:16 »
1-й скрипт отрабатывает 0.003712 сек.
2-й скрипт отрабатывает 7.240856 сек.
В админке выставлено MySqli.
Это реально происходит? Что-то не верится.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

voland

  • Профи
  • 9513
  • 422
  • Эта строка съедает место на вашем мониторе
Re: Где же найти узкое место
« Ответ #28 : 04.04.2016, 22:54:53 »
Я же сказал.
Всё, что меряется в мб или гб вдвое
*

Wertos

  • Завсегдатай
  • 505
  • 21
Re: Где же найти узкое место
« Ответ #29 : 04.04.2016, 22:57:34 »
1-й скрипт отрабатывает 0.003712 сек.
2-й скрипт отрабатывает 7.240856 сек.
В админке выставлено MySqli.
Это реально происходит? Что-то не верится.
Ещё прикол в том, что если использовать API J! то первый запуск скрипта ~6 сек. 2й(с тем-же запросом) уже 0.01сек(точно не помню, но где-то так). Далее меняю лимиты, запускаю... опять 6сек, 2й,3й, Nй запуск по 0.01сек. И так до смены лимита. Так же и на сайте, захожу в категорию эту, 6сек страничка открывается. Обновляю(ctrl+r) и очень быстро открывается(мгновенно почти) Перехожу в пагинации на след. страничку, опять 6 сек, обновляю, мгновенно !

На скрине видно, большое время как раз при смене лимита(как в пагинации)
« Последнее редактирование: 04.04.2016, 23:05:03 от Wertos »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

помогите найти проблему

Автор kuraltay-khan

Ответов: 18
Просмотров: 155
Последний ответ 28.08.2017, 17:20:13
от dmitry_stas
Никак не могу найти модуль, плагин, аддон, который предназначен на странице товара для отображения

Автор Zhanadil1509

Ответов: 13
Просмотров: 164
Последний ответ 10.08.2017, 11:40:27
от Zhanadil1509
Не могу на сайте найти где редактировать форму

Автор HolySong

Ответов: 6
Просмотров: 293
Последний ответ 18.07.2017, 09:43:28
от SeBun
как найти код?

Автор GROUL

Ответов: 6
Просмотров: 181
Последний ответ 01.07.2017, 17:13:06
от 1-F7
Как найти "Position" в админ панели?

Автор billov

Ответов: 1
Просмотров: 139
Последний ответ 01.06.2017, 16:38:34
от darkghost