#php #mysql #performance #doctrine-1.2
#php #mysql #Производительность #доктрина-1.2
Вопрос:
Вот моя настройка:
Windows Server 2008 R2
MySQL 5.1.562
Php 5.3.2
Doctrine 1.2
У кого-нибудь есть идея, почему моему запросу требуется около одной секунды для выполнения простого запроса.
echo date("Y-m-d H:i:s", time()) ."::::::" . microtime(true)."<br />";
$q = Doctrine_Query::create()
->from("Ordering")
->where("client_id = ?",array($_SESSION["UserID"]));
$ResProduct = $q->execute();
echo date("Y-m-d H:i:s", time()) ."::::::" . microtime(true)."<br />";
Вот результат 2 echo, чтобы показать вам, сколько времени требуется для выполнения запроса.
2011-04-21 01:48:24::::::1303364904.8051
2011-04-21 01:48:25::::::1303364905.8418
Другое дело, что в базе данных нет данных.
Редактировать
Я выполняю запрос непосредственно в консоли mysql и получаю результат очень быстро
mysql> select * from Ordering where client_id = 2;
---- ------------ ------- ------ -----------
| id | product_id | price | qty | client_id |
---- ------------ ------- ------ -----------
| 7 | 1 | 0.89 | 20 | 2 |
---- ------------ ------- ------ -----------
1 row in set (0.00 sec)
Комментарии:
1. Нравится заголовок «Моя доктрина действительно медленная» … ;-D
2. Я не понимаю, почему вы используете
microtime_float()
в php 5.3.2. Используйтеmicrotime(true)
.3. Спасибо, я не знал этого для microtime (true). Приятно 🙂
Ответ №1:
- Используйте
microtime(true)
вместоmicrotime_float()
- Настройте MySQL так, чтобы не разрешать IP-адреса подключающихся клиентов: http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_skip-name-resolve
client_id = ?
— почему вы приводите$_SESSION["UserID"]
к массиву? Я думаю, что в этом нет необходимости.
Комментарии:
1. Ребята здесь мастера 🙂 Большое спасибо @FractalizeR. Вы спасаете мою ночь. Большое спасибо. 39 МС выполнение того же запроса, но с пропуском имени-разрешения, пропуском хоста-кэша в файле my.ini.
Ответ №2:
Прежде всего, ваш код не кажется неправильным или что-то в этом роде.
В принципе, однако, ваш SQL-запрос обычно будет выглядеть следующим образом :
select *
from Ordering
where client_id = 123456
Это означает, что установка индекса в client_id
столбце, вероятно, должна помочь — очень сильно, если в этой таблице много строк.
Пара соответствующих ссылок, об этом :
Комментарии:
1. У меня уже есть индекс по client_id. И, как я уже говорил в своем посте, в базе данных пока нет данных.
Ответ №3:
Просто из любопытства вы пытались выполнить запрос RawSql? У нас была проблема, похожая на эту, и в конечном итоге это была проблема с DNS. Несмотря на то, что все должно было быть localhost, сервер apache по какой-то причине переходил на внешний, чтобы преобразовать адрес в mysql.