SlideShare a Scribd company logo
1 of 42
<Insert Picture Here>
MySQL Client Side Caching
Johannes Schlüter
Twitter: @phperror
MySQL Engineering – Connectors and Client Connectivity
# pecl install mysqlnd_qc-beta
Gracias por vuestra atención!
mysqlnd
Server API (SAPI)
CGI CLI Embed ISAPI NSAPI phttpd thttpd ...
Zend Engine PHP Runtime
PHP Extensions
bcmath mysql mysqli mysqlnd pdo pdo_mysql xml ...
PHP 5.3 and mysqlndPHP
PHPMemory
PHPStreams
Infrastructure
mysqlnd – MySQL native driver for PHP
MySQL Server
ext/mysql mysqli PDO_mysql
…
PHP Module (Extension) API
Building PHP with mysqlnd
• ./configure 
--with-mysql=mysqlnd 
--with-mysqli=msqlnd 
--with-pdo-mysql=mysqlnd
• Default on Windows and some distributions
mysqlnd vs. libmysql
MySQL Server MySQL Server
mysqlnd libmysql
PHP PHP
PHP Memory
libmysql Memory
PHP Memory
PHP Memory
copy
copy
usedirectly
copy
mysqlnd Statistics
• Around 150 statistic values collected
• mysqli_get_client_stats (),
mysqli_get_connection_stats()
Asynchronous Queries
/* Do something */
PHP Script MySQL
query
result
query
poll
result
$conn = new MySQLi(...);
$conn->query(
"SELECT * FROM t WHERE ....",
MYSQLI_ASYNC);
/* Process query results */
mysqli_poll($links, $errors, $reject, 1);
Sharding
<?php
…
?>
Sharding
foreach ($all_links as $link)
$link->query("SELECT 'test' ", MYSQLI_ASYNC);
$processed = 0;
do {
$links = $all_links;
if (!mysqli_poll($links, $errors, $reject, 1)) continue; /* TIMEOUT */
foreach ($links as $link) {
if ($result = $link->reap_async_query()) {
print_r($result->fetch_row());
mysqli_free_result($result);
$processed++;
}
}
} while ($processed < count($all_links));
mysqlnd plugins
Plugin Hook
mysqlnd Query
mysqli::query()mysql_query() PDO::query()
Wire Protocol
Plugin Hook
Network
Drupal, Symphony, phpMyFAQ, phpMyAdmin, Oxid, ...
ext/mysql, ext/mysqli, ext/PDO_MYSQL
MySQL Server
mysqlnd
Load Balancing Monitoring Performance
mysqlnd plugin
Query Cache Plugin vs. MySQL Proxy
Application client Application client Application client
MySQL Proxy
PHP client PHP client PHP client
mysqlnd pluginmysqlnd plugin mysqlnd plugin
MySQL Server
MySQL Server
Experimental Extensions
• By Oracle:
– mysqlnd_sip
– mysqlnd_mc
– mysqlnd_ms
– mysqlnd_pscache
• By Community:
– mysqlnd_uh
(David Soria Parra /
Mayflower GmbH)
• http://pecl.php.net/
The Database Is The Bottleneck
Caching!
“Traditional” Caches
• MySQL Server Cache
– MySQL Query Cache
• Application-Level Cache
– PEAR::Cache, Zend_Cache, …
MySQL Query Cache (Server-Side)
✔
Integrated with the MySQL Server
✔
No application changes
✔
Automatic invalidation
–
table based
✗
Needs network communication with server
✗
Needs server resources (memory, CPU)
Application-Level Caches
✔
Can cache higher level structures
– Complete rendered HTML blocks
✔
Multiple backends
– Can be shared over multiple servers (via memcache etc.)
✗
No automatic invalidation
✗
Requires application changes
<Insert Picture Here>
Introducing:
mysqlnd Client Side Cache
# pecl install mysqlnd_qc-beta
Andrey Hristov
Ulf Wendel
mysqlnd Query Cache
PHP
mysql / mysqli / PDO_mysql
mysqlnd
Cache Backend
Query Cache
MySQL Server
SELECT a
FROM t No!
SELECT a
FROM t
ResultResult
Local Memory, APC,
Memcache, Custom Handler
Key Properties
• Transparent
– PHP Extension hooking into mysqlnd
• Works with ext/mysql, mysqli, pdo_mysql
• Pluggable storage handler
– By default: local memory, APC, memcache, SQLite
– PHP Userspace
• Invalidation via TTL
– No automatic invalidation by server
– Custom handlers may use custom invalidation logic
Transparent?
$mysqli = new mysqli($host, $user, $pw, $db);
$sql = “SELECT SLEEP(10) FROM table”;
$start = microtime(true);
$res = $mysqli->query($sql);
$res = $mysqli->query($sql);
$end = microtime(true);
echo $end - $start;
→ 20.019539117813
Transparent?
$mysqli = new mysqli($host, $user, $pw, $db);
$sql = sprintf(“/*%s*/SELECT SLEEP(10) FROM table”,
MYSQLND_QC_ENABLE_SWITCH);
$start = microtime(true);
$res = $mysqli->query($sql);
$res = $mysqli->query($sql);
$end = microtime(true);
echo $end - $start;
→ 10.142804088593
Transparent!
mysqlnd_qc.cache_by_default = 1
!Usually you should NOT do this!
SQL Hints
• MYSQLND_QC_ENABLE_SWITCH
– qc=on
• MYSQLND_QC_DISABLE_SWITCH
– qc=off
• MYSQLND_QC_TTL_SWITCH
– qc_ttl=
Storage Handlers
●
Storage
– Scope: request, process, machine, multi-machine
– Location: distance to cache
– Replacement strategy
– Slam defense strategy
●
Decide what to cache
– is_select() - detect SQL hints
●
Extended statistics
– Storage statistics, traces, timings
Cache Expiry
Client 1
MySQL
Client 2...n
Cache Hit
MySQL
Client 1 Client 2...n
Slam Defense
Client 1
MySQL
Client 2...n
Expired
MySQL
Client 1 Client 2...n
Cache Hit
Refresh
Core Statistics
• Collected by: mysqlnd_qc core
– php.net/manual/en/function.mysqlnd_qc_get_core_stats.php
• Scope: process
– Process: mysqlnd_qc_get_core_stats()
– Aggregated values from all PHP MySQL APIs
• Contents: wide range
– Cache usage and efficiency
– Network related
– Timings
Query Statistics and Backtraces
• Collected by: mysqlnd_qc core
– php.net/manual/en/function.mysqlnd_qc_get_query_trace_log
.php
• Scope: process
– mysqlnd_qc_get_query_trace_log()
– mysqlnd_qc_get_normalized_query_trace_log()
• Contents
– Origin - backtrace
– Timings
Storage Handler Statistics
• Collected by: storage handler
– php.net/manual/en/function..mysqlnd_qc_get_cache_info.php
• Scope: cache entry
– Depends on storage handler scope
– Aggregated values from all PHP MySQL APIs
• Contents: none or assorted
– Depends on storage handler support
– APC: timings, hit ratio, result set size
– Default: APC plus result set meta data
User-Defined Storage Handler
• Procedural
– php.net/manual/en/function.mysqlnd_qc_set_user_handlers.php
– Callback functions
• Object oriented
– slideshare.net/nixnutz/mysqlnd-query-cache-plugin-userdefined-
storage-handler
– Interface mysqlnd_qc_handler
• Extending mysqlnd_qc_handler_default
<?php
/* auto_prepend_file = /path/to/prepend.php */
class my_qc extends mysqlnd_qc_handler_default
{
public function is_select($query)
{
if (preg_match("@from employees where@ism", $query))
{
/* cache query for mysqlnd_qc.ttl seconds */
return true;
}
return parent::is_select($query);
}
}
$qc = new my_qc();
mysqlnd_qc_change_handler($qc);
?>
Resources
• php.net/mysqlnd_qc
– Installation, Examples, Functions
• php.net/mysqlnd
– Introduction, Changes, C plugin API
• slideshare.net/nixnutz/presentations
– QC Basics
– QC User defined storage handler
– QC Statistics
– QC Benchmark impressions
The preceding is intended to outline our general
product direction. It is intended for information
purposes only, and may not be incorporated into any
contract. It is not a commitment to deliver any
material, code, or functionality, and should not be
relied upon in making purchasing decisions.
The development, release, and timing of any
features or functionality described for Oracle’s
products remains at the sole discretion of Oracle.
Mysqlnd Query Cache
Mysqlnd Query Cache

More Related Content

What's hot

My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2
Morgan Tocker
 
Mysql User Camp : 20th June - Mysql New Features
Mysql User Camp : 20th June - Mysql New FeaturesMysql User Camp : 20th June - Mysql New Features
Mysql User Camp : 20th June - Mysql New Features
Tarique Saleem
 
Tool it Up! - Session #3 - MySQL
Tool it Up! - Session #3 - MySQLTool it Up! - Session #3 - MySQL
Tool it Up! - Session #3 - MySQL
toolitup
 
Mysql User Camp : 20-June-14 : Mysql Fabric
Mysql User Camp : 20-June-14 : Mysql FabricMysql User Camp : 20-June-14 : Mysql Fabric
Mysql User Camp : 20-June-14 : Mysql Fabric
Mysql User Camp
 
Optimizing MySQL for Cascade Server
Optimizing MySQL for Cascade ServerOptimizing MySQL for Cascade Server
Optimizing MySQL for Cascade Server
hannonhill
 
Performance Tuning Best Practices
Performance Tuning Best PracticesPerformance Tuning Best Practices
Performance Tuning Best Practices
webhostingguy
 

What's hot (20)

MySQL 5.7 - What's new and How to upgrade
MySQL 5.7 - What's new and How to upgradeMySQL 5.7 - What's new and How to upgrade
MySQL 5.7 - What's new and How to upgrade
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
 
Upgrade to MySQL 5.7 and latest news planned for MySQL 8
Upgrade to MySQL 5.7 and latest news planned for MySQL 8Upgrade to MySQL 5.7 and latest news planned for MySQL 8
Upgrade to MySQL 5.7 and latest news planned for MySQL 8
 
My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2
 
MySQL Performance - Best practices
MySQL Performance - Best practices MySQL Performance - Best practices
MySQL Performance - Best practices
 
Technical Introduction to PostgreSQL and PPAS
Technical Introduction to PostgreSQL and PPASTechnical Introduction to PostgreSQL and PPAS
Technical Introduction to PostgreSQL and PPAS
 
My sql5.7 whatsnew_presentedatgids2015
My sql5.7 whatsnew_presentedatgids2015My sql5.7 whatsnew_presentedatgids2015
My sql5.7 whatsnew_presentedatgids2015
 
Mysql User Camp : 20th June - Mysql New Features
Mysql User Camp : 20th June - Mysql New FeaturesMysql User Camp : 20th June - Mysql New Features
Mysql User Camp : 20th June - Mysql New Features
 
Tool it Up! - Session #3 - MySQL
Tool it Up! - Session #3 - MySQLTool it Up! - Session #3 - MySQL
Tool it Up! - Session #3 - MySQL
 
MySQL :What's New #GIDS16
MySQL :What's New #GIDS16MySQL :What's New #GIDS16
MySQL :What's New #GIDS16
 
MySQL configuration - The most important Variables
MySQL configuration - The most important VariablesMySQL configuration - The most important Variables
MySQL configuration - The most important Variables
 
Upcoming changes in MySQL 5.7
Upcoming changes in MySQL 5.7Upcoming changes in MySQL 5.7
Upcoming changes in MySQL 5.7
 
Mysql User Camp : 20-June-14 : Mysql Fabric
Mysql User Camp : 20-June-14 : Mysql FabricMysql User Camp : 20-June-14 : Mysql Fabric
Mysql User Camp : 20-June-14 : Mysql Fabric
 
MySQL For Linux Sysadmins
MySQL For Linux SysadminsMySQL For Linux Sysadmins
MySQL For Linux Sysadmins
 
MySQL Tuning
MySQL TuningMySQL Tuning
MySQL Tuning
 
MySQL Performance Tuning Variables
MySQL Performance Tuning VariablesMySQL Performance Tuning Variables
MySQL Performance Tuning Variables
 
MySQL Performance Tuning - GNUnify 2010
MySQL Performance Tuning - GNUnify 2010MySQL Performance Tuning - GNUnify 2010
MySQL Performance Tuning - GNUnify 2010
 
Optimizing MySQL for Cascade Server
Optimizing MySQL for Cascade ServerOptimizing MySQL for Cascade Server
Optimizing MySQL for Cascade Server
 
Proxysql use case scenarios fosdem17
Proxysql use case scenarios    fosdem17Proxysql use case scenarios    fosdem17
Proxysql use case scenarios fosdem17
 
Performance Tuning Best Practices
Performance Tuning Best PracticesPerformance Tuning Best Practices
Performance Tuning Best Practices
 

Similar to Mysqlnd Query Cache

Deploying nginx with minimal system resources
Deploying nginx with minimal system resourcesDeploying nginx with minimal system resources
Deploying nginx with minimal system resources
Max Ukhanov
 

Similar to Mysqlnd Query Cache (20)

MySQL PHP native driver : Advanced Functions / PHP forum Paris 2013
 MySQL PHP native driver  : Advanced Functions / PHP forum Paris 2013   MySQL PHP native driver  : Advanced Functions / PHP forum Paris 2013
MySQL PHP native driver : Advanced Functions / PHP forum Paris 2013
 
Built-in query caching for all PHP MySQL extensions/APIs
Built-in query caching for all PHP MySQL extensions/APIsBuilt-in query caching for all PHP MySQL extensions/APIs
Built-in query caching for all PHP MySQL extensions/APIs
 
Speeding Up The Snail
Speeding Up The SnailSpeeding Up The Snail
Speeding Up The Snail
 
Ipc mysql php
Ipc mysql php Ipc mysql php
Ipc mysql php
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Introduction to memcached
Introduction to memcachedIntroduction to memcached
Introduction to memcached
 
Mysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extensionMysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extension
 
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012
 
PHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on NginxPHP conference Berlin 2015: running PHP on Nginx
PHP conference Berlin 2015: running PHP on Nginx
 
Mysqlnd query cache plugin statistics and tuning
Mysqlnd query cache plugin statistics and tuningMysqlnd query cache plugin statistics and tuning
Mysqlnd query cache plugin statistics and tuning
 
php & performance
 php & performance php & performance
php & performance
 
PHP & Performance
PHP & PerformancePHP & Performance
PHP & Performance
 
Deploying nginx with minimal system resources
Deploying nginx with minimal system resourcesDeploying nginx with minimal system resources
Deploying nginx with minimal system resources
 
Improve WordPress performance with caching and deferred execution of code
Improve WordPress performance with caching and deferred execution of codeImprove WordPress performance with caching and deferred execution of code
Improve WordPress performance with caching and deferred execution of code
 
Wckansai 2014
Wckansai 2014Wckansai 2014
Wckansai 2014
 
HPPG - high performance photo gallery
HPPG - high performance photo galleryHPPG - high performance photo gallery
HPPG - high performance photo gallery
 
Zendcon scaling magento
Zendcon scaling magentoZendcon scaling magento
Zendcon scaling magento
 
Northeast PHP - High Performance PHP
Northeast PHP - High Performance PHPNortheast PHP - High Performance PHP
Northeast PHP - High Performance PHP
 
Top ten-list
Top ten-listTop ten-list
Top ten-list
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 

More from Anis Berejeb

Advanced Date/Time Handling with PHP
Advanced Date/Time Handling with PHPAdvanced Date/Time Handling with PHP
Advanced Date/Time Handling with PHP
Anis Berejeb
 
APC & Memcache the High Performance Duo
APC & Memcache the High Performance DuoAPC & Memcache the High Performance Duo
APC & Memcache the High Performance Duo
Anis Berejeb
 
Barcelona mysqlnd qc
Barcelona mysqlnd qcBarcelona mysqlnd qc
Barcelona mysqlnd qc
Anis Berejeb
 
Barcelona 2010 hidden_features
Barcelona 2010 hidden_featuresBarcelona 2010 hidden_features
Barcelona 2010 hidden_features
Anis Berejeb
 

More from Anis Berejeb (8)

Perf tuning2
Perf tuning2Perf tuning2
Perf tuning2
 
Explain2
Explain2Explain2
Explain2
 
Advanced Date/Time Handling with PHP
Advanced Date/Time Handling with PHPAdvanced Date/Time Handling with PHP
Advanced Date/Time Handling with PHP
 
APC & Memcache the High Performance Duo
APC & Memcache the High Performance DuoAPC & Memcache the High Performance Duo
APC & Memcache the High Performance Duo
 
Barcelona mysqlnd qc
Barcelona mysqlnd qcBarcelona mysqlnd qc
Barcelona mysqlnd qc
 
Mysql tracing
Mysql tracingMysql tracing
Mysql tracing
 
Mysql tracing
Mysql tracingMysql tracing
Mysql tracing
 
Barcelona 2010 hidden_features
Barcelona 2010 hidden_featuresBarcelona 2010 hidden_features
Barcelona 2010 hidden_features
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Mysqlnd Query Cache

  • 1.
  • 2. <Insert Picture Here> MySQL Client Side Caching Johannes Schlüter Twitter: @phperror MySQL Engineering – Connectors and Client Connectivity
  • 3. # pecl install mysqlnd_qc-beta
  • 4. Gracias por vuestra atención!
  • 5. mysqlnd Server API (SAPI) CGI CLI Embed ISAPI NSAPI phttpd thttpd ... Zend Engine PHP Runtime PHP Extensions bcmath mysql mysqli mysqlnd pdo pdo_mysql xml ...
  • 6. PHP 5.3 and mysqlndPHP PHPMemory PHPStreams Infrastructure mysqlnd – MySQL native driver for PHP MySQL Server ext/mysql mysqli PDO_mysql … PHP Module (Extension) API
  • 7. Building PHP with mysqlnd • ./configure --with-mysql=mysqlnd --with-mysqli=msqlnd --with-pdo-mysql=mysqlnd • Default on Windows and some distributions
  • 8. mysqlnd vs. libmysql MySQL Server MySQL Server mysqlnd libmysql PHP PHP PHP Memory libmysql Memory PHP Memory PHP Memory copy copy usedirectly copy
  • 9. mysqlnd Statistics • Around 150 statistic values collected • mysqli_get_client_stats (), mysqli_get_connection_stats()
  • 10. Asynchronous Queries /* Do something */ PHP Script MySQL query result query poll result $conn = new MySQLi(...); $conn->query( "SELECT * FROM t WHERE ....", MYSQLI_ASYNC); /* Process query results */ mysqli_poll($links, $errors, $reject, 1);
  • 12. Sharding foreach ($all_links as $link) $link->query("SELECT 'test' ", MYSQLI_ASYNC); $processed = 0; do { $links = $all_links; if (!mysqli_poll($links, $errors, $reject, 1)) continue; /* TIMEOUT */ foreach ($links as $link) { if ($result = $link->reap_async_query()) { print_r($result->fetch_row()); mysqli_free_result($result); $processed++; } } } while ($processed < count($all_links));
  • 13. mysqlnd plugins Plugin Hook mysqlnd Query mysqli::query()mysql_query() PDO::query() Wire Protocol Plugin Hook Network
  • 14. Drupal, Symphony, phpMyFAQ, phpMyAdmin, Oxid, ... ext/mysql, ext/mysqli, ext/PDO_MYSQL MySQL Server mysqlnd Load Balancing Monitoring Performance mysqlnd plugin
  • 15. Query Cache Plugin vs. MySQL Proxy Application client Application client Application client MySQL Proxy PHP client PHP client PHP client mysqlnd pluginmysqlnd plugin mysqlnd plugin MySQL Server MySQL Server
  • 16. Experimental Extensions • By Oracle: – mysqlnd_sip – mysqlnd_mc – mysqlnd_ms – mysqlnd_pscache • By Community: – mysqlnd_uh (David Soria Parra / Mayflower GmbH) • http://pecl.php.net/
  • 17. The Database Is The Bottleneck
  • 19. “Traditional” Caches • MySQL Server Cache – MySQL Query Cache • Application-Level Cache – PEAR::Cache, Zend_Cache, …
  • 20. MySQL Query Cache (Server-Side) ✔ Integrated with the MySQL Server ✔ No application changes ✔ Automatic invalidation – table based ✗ Needs network communication with server ✗ Needs server resources (memory, CPU)
  • 21. Application-Level Caches ✔ Can cache higher level structures – Complete rendered HTML blocks ✔ Multiple backends – Can be shared over multiple servers (via memcache etc.) ✗ No automatic invalidation ✗ Requires application changes
  • 23. # pecl install mysqlnd_qc-beta Andrey Hristov Ulf Wendel
  • 24. mysqlnd Query Cache PHP mysql / mysqli / PDO_mysql mysqlnd Cache Backend Query Cache MySQL Server SELECT a FROM t No! SELECT a FROM t ResultResult Local Memory, APC, Memcache, Custom Handler
  • 25. Key Properties • Transparent – PHP Extension hooking into mysqlnd • Works with ext/mysql, mysqli, pdo_mysql • Pluggable storage handler – By default: local memory, APC, memcache, SQLite – PHP Userspace • Invalidation via TTL – No automatic invalidation by server – Custom handlers may use custom invalidation logic
  • 26. Transparent? $mysqli = new mysqli($host, $user, $pw, $db); $sql = “SELECT SLEEP(10) FROM table”; $start = microtime(true); $res = $mysqli->query($sql); $res = $mysqli->query($sql); $end = microtime(true); echo $end - $start; → 20.019539117813
  • 27. Transparent? $mysqli = new mysqli($host, $user, $pw, $db); $sql = sprintf(“/*%s*/SELECT SLEEP(10) FROM table”, MYSQLND_QC_ENABLE_SWITCH); $start = microtime(true); $res = $mysqli->query($sql); $res = $mysqli->query($sql); $end = microtime(true); echo $end - $start; → 10.142804088593
  • 29. SQL Hints • MYSQLND_QC_ENABLE_SWITCH – qc=on • MYSQLND_QC_DISABLE_SWITCH – qc=off • MYSQLND_QC_TTL_SWITCH – qc_ttl=
  • 30. Storage Handlers ● Storage – Scope: request, process, machine, multi-machine – Location: distance to cache – Replacement strategy – Slam defense strategy ● Decide what to cache – is_select() - detect SQL hints ● Extended statistics – Storage statistics, traces, timings
  • 31. Cache Expiry Client 1 MySQL Client 2...n Cache Hit MySQL Client 1 Client 2...n
  • 32. Slam Defense Client 1 MySQL Client 2...n Expired MySQL Client 1 Client 2...n Cache Hit Refresh
  • 33. Core Statistics • Collected by: mysqlnd_qc core – php.net/manual/en/function.mysqlnd_qc_get_core_stats.php • Scope: process – Process: mysqlnd_qc_get_core_stats() – Aggregated values from all PHP MySQL APIs • Contents: wide range – Cache usage and efficiency – Network related – Timings
  • 34. Query Statistics and Backtraces • Collected by: mysqlnd_qc core – php.net/manual/en/function.mysqlnd_qc_get_query_trace_log .php • Scope: process – mysqlnd_qc_get_query_trace_log() – mysqlnd_qc_get_normalized_query_trace_log() • Contents – Origin - backtrace – Timings
  • 35. Storage Handler Statistics • Collected by: storage handler – php.net/manual/en/function..mysqlnd_qc_get_cache_info.php • Scope: cache entry – Depends on storage handler scope – Aggregated values from all PHP MySQL APIs • Contents: none or assorted – Depends on storage handler support – APC: timings, hit ratio, result set size – Default: APC plus result set meta data
  • 36. User-Defined Storage Handler • Procedural – php.net/manual/en/function.mysqlnd_qc_set_user_handlers.php – Callback functions • Object oriented – slideshare.net/nixnutz/mysqlnd-query-cache-plugin-userdefined- storage-handler – Interface mysqlnd_qc_handler • Extending mysqlnd_qc_handler_default
  • 37. <?php /* auto_prepend_file = /path/to/prepend.php */ class my_qc extends mysqlnd_qc_handler_default { public function is_select($query) { if (preg_match("@from employees where@ism", $query)) { /* cache query for mysqlnd_qc.ttl seconds */ return true; } return parent::is_select($query); } } $qc = new my_qc(); mysqlnd_qc_change_handler($qc); ?>
  • 38. Resources • php.net/mysqlnd_qc – Installation, Examples, Functions • php.net/mysqlnd – Introduction, Changes, C plugin API • slideshare.net/nixnutz/presentations – QC Basics – QC User defined storage handler – QC Statistics – QC Benchmark impressions
  • 39.
  • 40. The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.