Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 12.10.2009
Сообщений: 35

Разница во времени выполнения запроса к MySQL

27.04.2016, 00:16. Показов 1408. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени!

Пишу PHP-скрипт в Дэнвере. Никак не получается добится требуемой скорострельности. Обратил внимание вот на что:

Пишу в скрипте, например, такой код:

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    $dblink = @mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname) OR message_die(@mysql_errno(), @mysql_error(), __FILE__, __LINE__);
 
    @mysqli_query($dblink, "SET character_set_database=utf8");
    @mysqli_query($dblink, "SET NAMES utf8");
 
    $sql = "SELECT DISTINCT n.`id` AS id, n.`name` AS name, n.`num` AS num FROM `prs_5gramms` AS g, `prs_normal` AS n WHERE g.`code` IN (11302, 361664, 11573248, 1245185, 6291500, 1414, 45259, 1448306, 12791361, 6670382, 12125637, 18921649, 1512992, 14861312) AND n.`id` = g.`id` AND num >= 11 AND num <= 23";

    $tm = microtime(1);

    $similars = mysqli_query($dblink, $sql);

    $tm = microtime(1) - $tm;

    printf("Total Time: %f<br/>", $tm);
 
    @mysqli_free_result($similars) OR message_die(@mysql_errno(), @mysql_error(), __FILE__, __LINE__);
 
    @mysqli_close($dbcnx) OR message_die(@mysql_errno(), @mysql_error(), __FILE__, __LINE__);
Вызываю этот скрипт из браузера.
Результат времени выполнения вызова mysqli_query - 0,7-0,8 секунды. Очень и очень много.

Задаю тот же самый SQL-запрос в phpMyAdmin. Время выполнения - около 0,005 секунды. Это уже хорошо.

Чем вызвана такая гигантская разница? Кто виноват? PHP? Дэнвер? Я?

Пробовал на разных машинах на разных версиях Дэнвера. Использовал библиотеки mysql и mysqli - результат одинаковый.

Но ведь phpMyAdmin тоже какой-то API использует. Возможно, что тот же самый. Откуда тогда такая разница? Можно ли как-то добиться, чтобы время вызова функции из скрипта было соразмерно с временем выполнения запроса?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.04.2016, 00:16
Ответы с готовыми решениями:

Замер выполнения кода (разница времени между контрольными точками)
нагуглил my $start_time = ; # код my $delta = tv_interval($start_time); print $delta; в результате какое-то...

Сокращение времени выполнения POST-запроса
Подскажите, пожалуйста, как можно сократить время выполнения POST запроса? WebRequest request = WebRequest.Create(adress); ...

Программа для замера времени выполнения запроса
Я тут прогу написал, она замеряет время выполнения SQL...Вроде работает, но то ли время она выдает? Нужно время от начала вып-я запроса до...

2
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
27.04.2016, 03:32
Цитата Сообщение от Pochemuk Посмотреть сообщение
Чем вызвана такая гигантская разница?
phpMyAdmin возможно limit к запросу добавляет, что может повлиять на время выполнения
0
0 / 0 / 0
Регистрация: 12.10.2009
Сообщений: 35
27.04.2016, 22:59  [ТС]
Да, всё верно: не обратил внимания, что там не 1-2 страницы получается, а более сотни. А если выводить последнюю страницу, то время как раз и будет все те же 0,7-0,8 секунды.

Проблема в безграмотном запросе. Опция DISTINCT применяется к объединенному результату сцепления таблиц n и g. Т.е. сначала делается выборка из g с включением всевозможных дублей. Потом она объединяется с n. И только потом прореживается.

Попытался сделать недублирующую выборку из g вложенным запросом. Результат был ужасен. Вместо того, чтобы сначала получить недублирующую выборку из g и связать ее по индексу с n, MySQL стал просматривать ВСЮ таблицу n и для каждой итерации выполнять свою выборку из g.

Попытался подойти с другой стороны:

SQL
1
2
3
4
5
6
7
EXPLAIN SELECT n.`id` AS id, n.`name` AS name, n.`num` AS num
FROM (SELECT DISTINCT `id` FROM `prs_5gramms`
WHERE `code` IN (11302, 361664, 11573248, 1245185, 6291500, 1414, 45259, 1448306, 12791361, 6670382, 12125637, 18921649, 1512992, 14861312)
) AS g
INNER JOIN `prs_normal` AS n
USING (`id`)
WHERE `num` >= 11 AND `num` <= 23
Этот запрос работает раза в 3-4 быстрее, но все равно через ж...

Вот результат прогона через EXPLAIN:

Code
1
2
3
4
id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    3277     
1   PRIMARY n   eq_ref  PRIMARY PRIMARY 4   g.id    1   Using where
2   DERIVED prs_5gramms range   code    code    4   NULL    17663   Using where; Using temporary
Никто не знает, как грамотно сделать выборку из двух таблиц (1:М) по общему ключу и по условию, что в индексном поле второй таблицы присутствует ХОТЯ БЫ одно значение из заданного набора?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2016, 22:59
Помогаю со студенческими работами здесь

Нет возврата после выполнения запроса к базе MySQL
Доброго времени суток! :) Пишу механизм авторизации (login). В качестве хранилища использую базу MySQL. Суть проблемы в том, что...

Полиморфизм времени выполнения/времени компиляции
Здравствуйте, подскажите, пожалуйста, литературу, где мне внятно можно узнать что такое полиморфизм ВРЕМЕНИ ВЫПОЛНЕНИЯ и ВРЕМЕНИ...

Гистограммы времени пребывания и гистограмма распределения времени пребывания - в чём разница
Собственно из названия топика всё ясно. Объясните в чём разница, а так же подскажите как строить гистограммы распределения времени. С...

Ошибка при отправке запроса MySQL через JDBC MySQL connector
При помощи Maven я вызываю зависимости Twilio и JDBC MySQL connector, и собираю .jar файл. У меня есть кнопка Update в моем GUI, когда я ее...

Разница в скорости выполнения, итераторы
Википедия for (ContainerType::iterator it = C.begin(),end = C.end(); it != end; ++it) { std::cout &lt;&lt; *it &lt;&lt; std::endl; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru