Новости Joomla

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

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Уже не могу проверить, удалил таблички. Количество строк в выборке может быть меньше 30%, и тогда индексы используются. Короче говоря, это всё условно и с большой натяжкой.
не совсем понимаю, почему заходит речь о 30%, если вытаскивается 130 записей из 23000. Буду благодарен, если просветите по вопросам в моем предыдущем посте.
Хостер сказал, что не видит существенной нагрузки на сервер, лишь посоветовал настроить кэширование страниц. почему же тогда все так медленно работает?
« Последнее редактирование: 15.07.2017, 12:39:02 от borro »
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
На мой взгляд ситуация выглядит так. Долго выполняется некоторого вида запрос с "коробочными" структурами этих двух таблиц, содержащий проверку IS NULL поля, которое не содержит индекс. Это происходит на определенных установках MySQL. См. выше мои проверки. После добавления индекса, а именно полю, по которому идет проверка на NULL и объединение таблиц, MySQL оптимизировал этот запрос - т.е. перестал полностью сканировать таблицу. С другой стороны, это поле описано как Not Null, т.е. не должно содержать NULL. У вас, кажется, и не было таких строк, поэтому это условие в запросе теоретически ничего не должно менять в отношении выводимых результатов. Поправьте, если я ошибаюсь.

Думаю, вам не нужно ничего менять в структуре таблиц, а следить, чтобы не было NULL там, где его быть не должно. В т.ч., чтобы не иметь сложностей с подобными запросами. https://dev.mysql.com/doc/refman/5.7/en/is-null-optimization.html. Наверное поэтому многие и избегают значений NULL в БД. Немного о EXPLAIN. https://habrahabr.ru/post/211022/. Можете сравнить результаты до добавления индекса и после.


« Последнее редактирование: 15.07.2017, 13:22:47 от capricorn »
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
не совсем понимаю, почему заходит речь о 30%, если вытаскивается 130 записей из 23000.
речь идет не о конечном количестве строк, а о количестве строк в выборке из одной таблице. например, выборка из ytgb1_virtuemart_medias по file_type = 'product' - хоть и для file_type создан индекс, в данном случае MySQL его не будет использовать, потому что в выборке будет
Цитировать
22659 rows in set (0.12 sec)
а это почти 100% от общего количества строк 22969. и MySQL это видит до запроса, и принимает решение, что полный скан таблицы будет эффективнее, чем выборка с использованием индексов. грубо говоря, отбросить ненужные строки (т.е. не попадающие под условие file_type = 'product') будет менее затратно, чем найти нужные.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
не совсем понимаю, почему заходит речь о 30%, если вытаскивается 130 записей из 23000. Буду благодарен, если просветите по вопросам в моем предыдущем посте.
Есть понятие "избирательность индекса" (index selectivity) - процент строк с уникальными значенями к общему количеству строк в таблице. Использование индекса имеет смысл только в случае, когда его избирательность достаточно высока. Говоря о "количестве строк в выборке", dmitry_stas и мел в виду не результат запроса, а то количество строк, которое запросу придется обрабатывать - то есть, некую "неизбирательность".
В вашем случае избирательность индекса file_type, например, очень мала: думаю, что большинство строк имеют значение "product".

P.S. О, уже ответили.
« Последнее редактирование: 15.07.2017, 13:37:57 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Это как раз и иллюстрирует EXPLAIN ТС-а, столбец raws. Также видно, что не используется индекс (отсутствует) по полю соединения таблиц - используется другое поле.

http://joomlaforum.ru/index.php/topic,339453.msg1717587.html#msg1717587.

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

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
На мой взгляд ситуация выглядит так. Долго выполняется некоторого вида запрос с "коробочными" структурами этих двух таблиц, содержащий проверку IS NULL поля, которое не содержит индекс. Это происходит на определенных установках MySQL. См. выше мои проверки. После добавления индекса, а именно полю, по которому идет проверка на NULL и объединение таблиц, MySQL оптимизировал этот запрос - т.е. перестал полностью сканировать таблицу. С другой стороны, это поле описано как Not Null, т.е. не должно содержать NULL. У вас, кажется, и не было таких строк, поэтому это условие в запросе теоретически ничего не должно менять в отношении выводимых результатов. Поправьте, если я ошибаюсь.

Думаю, вам не нужно ничего менять в структуре таблиц, а следить, чтобы не было NULL там, где его быть не должно. В т.ч., чтобы не иметь сложностей с подобными запросами. https://dev.mysql.com/doc/refman/5.7/en/is-null-optimization.html. Наверное поэтому многие и избегают значений NULL в БД. Немного о EXPLAIN. https://habrahabr.ru/post/211022/. Можете сравнить результаты до добавления индекса и после.


Да null тут ни при чем. Для быстрого JOIN нужно, чтобы поля привязки были проиндексированы, содержали либо pk, либо индексы. Проверку на null можно заменить сравнением строк -- скорости это не прибавит (скорее всего лишь убавит).
« Последнее редактирование: 15.07.2017, 18:39:59 от Филипп Сорокин »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Опять закачал себе таблицы, чтобы проверить вышесказанное. Собственно, тру. Попробуйте запрос:

Код
RESET QUERY CACHE;

SELECT
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM ytgb1_virtuemart_medias AS m
LEFT JOIN ytgb1_virtuemart_product_medias AS pm USING(virtuemart_media_id)
WHERE m.file_title != 'ABRAKADABRA'
AND m.file_type = 'product'

Или этот запрос, где одно условие удалено из фильтра:

Код
RESET QUERY CACHE;

SELECT
  `file_title`,
  `file_url`,
  `published`,
  `virtuemart_media_id`
FROM ytgb1_virtuemart_medias AS m
LEFT JOIN ytgb1_virtuemart_product_medias AS pm USING(virtuemart_media_id)
WHERE m.file_type = 'product'
« Последнее редактирование: 15.07.2017, 21:08:31 от Филипп Сорокин »
*

capricorn

  • Завсегдатай
  • 1949
  • 118 / 3
Как то ненормально это джойнить таблицы по полю где может быть null. Пусть даже только справа. Запутаться легко.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Как то ненормально это джойнить таблицы по полю где может быть null. Пусть даже только справа. Запутаться легко.
Нормально, иногда так делаю.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Нормально, иногда так делаю.
ну да, обычное вроде дело, когда надо выбрать строки со значением, которого нет во второй таблице.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Доброе утро. Хотел спросить. Если в виде используется пагинация, то каждый раз, запрашивая отдельную страницу с отображаемыми данными, идет полная выборка всех данных из базы данных, и отображается нужная страница пагинации или выборка запоминается в момент первого запроса данных, и навигация происходит более быстро?
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
Если в виде используется пагинация, то каждый раз, запрашивая отдельную страницу с отображаемыми данными, идет полная выборка всех данных из базы данных, и отображается нужная страница пагинации или выборка запоминается в момент первого запроса данных

А offset и limit на что?

Код: sql
"SELECT * FROM bla LIMIT 10 OFFSET 15";
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
А offset и limit на что?
То есть Joomla сама добавляет limit и offset к тому запросу, что описан в модели в функции getListQuery() модели? При этом пагинация должна объявляться строкой
Код: php
$this->pagination = $this->get('Pagination');
в функции display view.html.php?

А если у меня данные берутся не из модели, а вот так, прям во view.html.php и не совсем с помощью чистого sql, а по методу dmitry_stas, когда результаты запроса шерстятся в цикле foreach:
Код: php
	public function display($tpl = null){
$db = JFactory::getDbo();
$query = 'SELECT file_title,file_url,published,virtuemart_media_id
FROM `#__virtuemart_medias`
WHERE file_type="product"';
$db->setQuery($query);
$this->items = $db->loadObjectList();
$query = 'SELECT virtuemart_media_id
FROM `#__virtuemart_product_medias`';
$db->setQuery($query);
$ids = $db->loadObjectList('virtuemart_media_id');
foreach ($this->items as $k=>$v){
if (isset($ids[$v->virtuemart_media_id])) {
unset($this->items[$k]);
}
}
$this->pagination = $this->get('Pagination');
$this->addToolBar();
parent::display($tpl);
}
« Последнее редактирование: 17.07.2017, 09:56:28 от borro »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Так не пойдёт, конечно. Данные цепляются из модели. Посмотрите, как это реализовано в com_content. Например, в модели featured:

Код: php

$this->setState('list.start', $limitstart);
$this->setState('list.limit', $limit);

*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Добрый день.
Коллеги, как вы проверяете наличие индекса на столбец перед созданием индекса на этот столбец?
Нужно описать такую проверку в sql-файле, который будет исполняться с установкой компонента
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Добрый день.
Коллеги, как вы проверяете наличие индекса на столбец перед созданием индекса на этот столбец?
Нужно описать такую проверку в sql-файле, который будет исполняться с установкой компонента


Есть несколько способов, они могут отличаться в зависимости от СУБД. Пока четвёртая версия J! не вышла, в принципе, можно не забивать этим голову и рассчитывать только на MySQL:

Код: sql
SHOW INDEXES FROM #__content 
-- WHERE column_name = 'id'

Закомментированная строчка показывает индексы определённого столбца.
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Написал вот такой код для файла admin/sql/install.mysql.sql:
Код: sql
IF NOT EXISTS( SHOW INDEXES FROM #__virtuemart_product_medias WHERE column_name = 'virtuemart_media_id' AND Seq_in_index = 1)
ALTER TABLE #__virtuemart_product_medias ADD INDEX idx_vm_product_medias_media_id` (`virtuemart_media_id`);
после установки компонента не создался индекс. Кто-нибудь знает почему?
« Последнее редактирование: 18.07.2017, 16:08:20 от borro »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Написал вот такой код для файла admin/sql/install.mysql.sql:
Код: sql
IF NOT EXISTS( SHOW INDEXES FROM #__virtuemart_product_medias WHERE column_name = 'virtuemart_media_id' AND Seq_in_index = 1)
ALTER TABLE #__virtuemart_product_medias ADD INDEX idx_vm_product_medias_media_id` (`virtuemart_media_id`);
после установки компонента не создался индекс. Кто-нибудь знает почему?

Это не синтаксис SQL, парсер Вас не понимает :)
Условия в запросы обычно не пишут для этих целей, ну если Вы не собираетесь, конечно, писать метровые транзакции или процедуры :) Для того, чтобы проверить индекс при установке расширения, используйте события инсталлятора:

https://docs.joomla.org/J3.x:Developing_an_MVC_Component/Adding_an_install-uninstall-update_script_file
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
EXPLAIN SELECT самый объективный метод сравнить трудновыполнимость запросов? Я там не вижу стоимостных(временных) оценок выполнения запроса, кроме показаний в rows, но они для проверяемых вариантов запроса все одинаковые, так что понять по ним нельзя. Я гоняю варианты запроса несколько раз, чтобы набрать статистику, но можно ли доверять этой статистике?.. Вдруг на сервер обрушивается поток посетителей и моя малая статистика не объективна?..

Собственно ответ на поверхности - тестировать на локальном сервере
« Последнее редактирование: 19.07.2017, 10:19:34 от borro »
*

Филипп Сорокин

  • Завсегдатай
  • 1918
  • 160 / 4
  • разработчик.москва
Цитировать
EXPLAIN SELECT самый объективный метод сравнить трудновыполнимость запросов?

Это показывает лишь то, как MySQL обрабатывает запрос, каким образом делает выборку, фильтрацию и т.п. Трудновыполнимость запроса же зависит от многих и многих вещей, на которых Вы как разработчик стороннего ПО повлиять не можете. Так что оставьте кесарево кесарю, пользователю -- самостоятельно оптимизировать сервер и повышать его производительность.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
полностью согласен с Филиппом. вы все равно не сможете повлиять на тупой сервер, или на ошибки в его настройке. делайте просто как нужно, оптимально, и все. а вопросов все равно не избежать, не переживайте :) если расширение будет популярно. вы просто не сможете предусмотреть все возможные варианты.
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте!
Возникли вопросы:
1. js может напрямую обращаться к базе данных или так не безопасно(в силу того, что, может быть, в нем надо будет вбить учетные данные для подсоединения к бд)
2. через js можно сканировать файловую систему сайта?
Я просто думаю, зачем мне через js регулярно обращаться к php скрипту, если может быть есть вариант обойтись без посредника
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Здравствуйте!
Возникли вопросы:
1. js может напрямую обращаться к базе данных или так не безопасно(в силу того, что, может быть, в нем надо будет вбить учетные данные для подсоединения к бд)
2. через js можно сканировать файловую систему сайта?
Я просто думаю, зачем мне через js регулярно обращаться к php скрипту, если может быть есть вариант обойтись без посредника

1 - нет
2 - нет

Без посредника в виде php никак. И следует так же подумать о безопасности. Если бы JS управлял базой...представьте, вы получаете от сайта страничку, смотрите исходник, а там - хост базы, логин и пароль.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
эх, тема все равно флеймовая получилась. поэтому

1 - нет
2 - нет

строго говоря,

1 - да
2 - да

:) просто в таком случае javascript должен выполнятся на сервере (node.js)


borro, честно говоря вы даже немножко удивили. ну как вы представляете себе, чтобы клиентский скрипт мог иметь доступ к серверным данным? с учетом того, что я могу выполнить в принципе любой js, например в консоли браузера, получается кто-угодно может прочесть файловую систему вашего сервера? :) конечно, нет. клиентская часть (js) не может управлять сервером, серверная часть (php) не может управлять клиентом (браузером).
« Последнее редактирование: 21.07.2017, 18:30:13 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
просто в таком случае javascript должен выполнятся на сервере (node.js)
Я не уверен, что он знает, что это ) Я его слова понимал именно как клиентский JavaScript. Предлагаю не грузить человека, пусть пока учиться в рамках стандартного PHP+JavaScript.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Предлагаю не грузить человека, пусть пока учиться в рамках стандартного PHP+JavaScript.
та я не против :) то было исключительно на правах флейма, ибо тема уже все равно превратилась в обо всем понемногу :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

karabert

  • Захожу иногда
  • 276
  • 30 / 3
Про индексы писали, если таблицы долго мучили делитами и апдейтами, то стоит сделать дефрагментацию и оптимизацию используемых таблиц
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте! Возник вопрос по засеканию времени.
Более объективно, на мой взгляд, будет начинать его засекать с момента отправки AJAX запроса в js-скрипте. Дальше мы это значение передаем в php, где периодически проверяем.
И тут вопрос: время в js и php разное? Можно ли будет вычесть от текущего времени php время, засеченное в js? Если нет, то начинать засекать надо в первом месте в php, докуда достукивается ajax-запрос? Или есть вариант синхронизировать ход времени в js и php перед началом взаимодействия?
« Последнее редактирование: 25.07.2017, 15:45:05 от borro »
*

SeBun

  • BanMaster
  • 4018
  • 259 / 5
  • @SeBun48
Здравствуйте! Возник вопрос по засеканию времени. Более объективно, на мой взгляд, будет начинать его засекать с момента отправки AJAX запроса в js-скрипте. Дальше мы передаем это значение передаем в php, где периодически проверяем. И тут вопрос: время в js и php разное? Можно ли будет вычесть от текущего времени php время, засеченное в js? Если нет, то начинать засекать надо в первом месте в php, докуда достукивается ajax-запрос? Или есть вариант синхронизировать ход времени в js и php перед началом взаимодействия?

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

Поясню. Я говорил о засекании времени, затраченном на выполнение одной интерации цикла. Это делается для того, что бы понять, сколько интераций он может выполнить на текущем оборудовании и с текущей конфигурацией сервера. Потому что во первых - у большинства хостеров время выполнения скрипта = 30 секунд, и если скрипт не уложился, он удаляется из памяти. Вам нужно понять, уложиться ли ваша одна единственная интерация в тот промежуток времени, который вы задаете в JS, например, в 5 секунд. Во вторых у вас прогресс-бар, который должен обновляться с некоторым интервалом. Берите этот интервал в 3-5 секунд, и примерно считайте, сколько интераций сделает цикл за это время - время на обмен пакетами между клиентом и сервером. Не изобретайте замер времени от старта JS - это вам не нужно. Где вы это применять собрались? Нарисуйте на бумаге линию, это линия времени от клиента к серверу, нарисуйте параллельную линию - это время от сервера клиенту. Посчитайте математически сколько времени может тратиться и на какие операции, и станет все понятно.

ПС: JS будет делать запросы к PHP с заданным интервалом, его зачем мерить, если он известен? Хотите посчитать пропускную способность канала?
« Последнее редактирование: 25.07.2017, 14:05:35 от SeBun »
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Подумал, раз js будет обновлять страницу раз в 5 сек, то надо и засекать относительно его ожиданий в js, а не внутри php. Потому что время запуска задачи в js по любому раньше времени начала её исполнения в php. А на сколько оно раньше, вдруг возможна ситуация, что на более чем 5 сек произойдет задержка да хотя бы на секунду. Я не знаю, что может произойти в этом загадочном мире электронных технологий :) Php должен опираться на время, которое начало отсчитываться в js, а не когда он дошел до исполнения задачи, чтобы ответить не позднее, чем через 5 секунд, через которые js обновляет страницу
« Последнее редактирование: 25.07.2017, 15:43:08 от borro »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться