Моя доктрина действительно медленная. Простой запрос и одна секунда для получения результата

#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.