Существуют ли способы увеличения скорости выполнения mysqli-> prepare? - PullRequest
2 голосов
/ 11 октября 2011

Мои тесты выполняются довольно медленно ... У меня менее 100 тестов, но все равно требуется более 10 секунд для запуска на быстрой машине.Я попытался отключить покрытие кода и использовать кеширование для нескольких вещей, которые я делаю, которые затрагивают удаленные серверы (например, LDAP).

Профилирование тестов во время работы PHPUnit приводит к:

screenshot

полностью 10% времени работы, которое включает в себя время сбора информации и создания большого количества страниц для покрытия кода, расходуется на mysqli->prepare.К сожалению, я не могу абстрагировать базу данных здесь.Мало того, что я эффективно тестирую сам уровень доступа к базе данных, много логики реализовано в терминах JOIN s внутри тестируемого кода.

Есть ли какие-либо параметры конфигурации, которые я могу изменить, или что-нибудь подобноесделать это быстрее?Требует ли prepare обращения к серверу mysql (и поэтому может помочь настройка локального сервера mysql для тестирования?)

1 Ответ

6 голосов
/ 11 октября 2011

Да, оператор prepare() вызовет сервер MySQL.Подготовленные операторы выполняются на стороне сервера в два вызова: вызов PREPARE и вызов EXECUTE.

Например:

mysql> PREPARE stmt1 FROM 'SELECT * FROM mysql.user';
mysql> EXECUTE stmt1;

То же самое касается любого драйвера, будь тоявляется драйвером PHP драйвера JDBC.Чтобы доказать, что он действительно выполняет вызов, выполните этот код:

$mysqli->prepare('SELECT * FROM mysql.user');

... и в MySQL вы увидите следующее:

mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+--------------------------+
| Id  | User | Host      | db   | Command | Time | State | Info                     |
+-----+------+-----------+------+---------+------+-------+--------------------------+
| 564 | root | localhost | NULL | Query   |    0 | NULL  | show processlist         |
| 565 | root | localhost | NULL | Prepare |    0 | NULL  | SELECT * FROM mysql.user |
+-----+------+-----------+------+---------+------+-------+--------------------------+
2 rows in set (0.00 sec)

Чтобы ускорить это,вы можете использовать доменные сокеты UNIX на локальном компьютере (при условии, что у вас установлена ​​ОС POSIX).Это устраняет издержки TCP-квитирования и исправления ошибок, а также задержки в сети, поскольку они выполняются локально.

Однако лучшим решением на самом деле является абстрагирование соединений с базой данных с использованием фиктивных объектов, но вы уже зналитот.Модульный тест не является модульным тестом, если он должен подключаться к базе данных: это интеграционный тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...