Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP PDO:как повторното изготвяне на изявление влияе на производителността

MySQL (както повечето СУБД) ще кешира планове за изпълнение на подготвени оператори, така че ако потребител А създаде план за:

SELECT * FROM some_table WHERE a_col=:v1 AND b_col=:v2

(където v1 и v2 са обвързващи vars) след това изпраща стойности, които да бъдат интерполирани от СУБД, след това потребител Б изпраща същата заявка (но с различни стойности за интерполация) СУБД не трябва да регенерира плана. т.е. СУБД е тази, която намира съвпадащия план, а не PDO.

Това обаче означава, че всяка операция в базата данни изисква поне 2 двупосочни пътувания (първото за представяне на заявката, второто за представяне на vars за свързване), за разлика от едно кръгово пътуване за заявка с буквални стойности, тогава това въвежда допълнителни мрежови разходи . Също така има малка цена, свързана с дерефериране (и поддържане) на кеша на заявката/плана.

Ключовият въпрос е дали тази цена е по-голяма от цената на генериране на плана на първо място.

Въпреки че (според моя опит) определено изглежда, че има полза от производителността при използване на подготвени изрази с Oracle, не съм убеден, че същото важи и за MySQL - обаче много ще зависи от структурата на вашата база данни и сложността на заявка (или по-конкретно колко различни опции може да намери оптимизаторът за разрешаване на заявката).

Опитайте да го измерите сами (подсказка:може да искате да зададете прага за бавна заявка на 0 и да напишете някакъв код за преобразуване на буквалните стойности обратно в анонимни представяния за заявките, записани в регистрационните файлове).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да генерирам серия от средни почасови стойности в MySQL?

  2. Инсталирайте Mtop (MySQL Database Server Monitoring) в RHEL/CentOS 6/5/4, Fedora 17-12

  3. Изберете стойности от списък, които не са в таблица

  4. ГРЕШКА 1067 (42000):Невалидна стойност по подразбиране за 'created_at'

  5. 'max_user_connections' е зададен на 200 - все още получава грешка