SlideShare a Scribd company logo
Ulf Wendel, Oracle



    PHP mysqlnd
Connection Multiplexing

    PECL/mysqlnd_mux 1.0.0-prototype
The speaker says...
When fast is not fast enough, you pull all triggers. This
includes attempts to optimize an already reasonable fast
operation: connect time to MySQL.


The PHP mysqlnd connection multiplexing plugin,
shares a physical connection among multiple user
handles. Thus, connection overhead is saved on the client
side and the number of opened connection is reduced on the
server side.
PECL/mysqlnd_mux is an Oracle open source development
available from pecl.php.net. Developed by Andrey
Hristov.
Plugins are mostly transparent
 WordPress, Drupal, Symfony, Oxid, ZendFramework, ...


               mysql, mysqli, PDO_MYSQL

                       mysqlnd

              PECL/mysqlnd_mux plugin

               Connection Multiplexing



                     MySQL Server
The speaker says...
PECL/mysqlnd_mux is a plugin for the mysqlnd library. The
mysqlnd library is the default C client library used
by the PHP MySQL extensions mysql, mysqli and
PDO_MySQL internally. Mysqlnd ships with PHP since 5.3.


Plugins operate at a layer beneath the user APIs,
thus improvements are available to all PHP MySQL
APIs.


Other free plugins are PECL/mysqlnd_ms (replication and
load balancing), PECL/mysqlnd_qc (client-side query cache)
and many more.
PECL/mysqlnd_mux
●
    Multiplexing: share connection among handles
       Reduce client connect overhead, reduce server load
       Prototype, requires PHP 5.5.0+

        connect()        connect()         connect()


                    n connection handles

                    PECL/mysqlnd_mux

                        1 connection


                          MySQL
The speaker says...
The PHP mysqlnd connection multiplexing proxies MySQL
connections. Whenever a client attempts to open a
connection to a host, the plugin checks whether there is
already a cached network connection to the host in
question. If not, a new connection is established and
associated with the users' connection handle. Otherwise,
the users' connection handle is linked with an
already opened network connection.

This way, multiple user handles can point to the
same network connection and share it. Connection
overhead is saved and fewer connections are opened.
The price you pay
●
    Multiplexing means serializing tasks
        Possibility of wait situations
        Prototype: no upgrade to dedicated connection
        Prototype: no collision counter


    Query 1
                   MUX     Query 1   Query 2    MySQL
       Query 2


                                                  Time
The speaker says...
Sharing a resource often requires serializing access to it.
This is also the case with a shared connection of the PHP
mysqlnd connection multiplexing plugin. Serializing
actions bares the risks of collisions and wait
situations. In the example, a clients query has to wait for
completion of another clients query before it can be
executed. Query 2 waits for query 1 to finish.


The prototype is using a mutex to synchronize access to a
shared connection.
MUX as a demo of the plugin API
●
    No new API calls, it just works!

        Supports popular buffered queries
        (mysql_query(), mysqli_query(),
        PDO if using PDO::ATTR_EMULATE_PREPARES)

        Prototype does not handle unbuffered queries
        (mysqli_real_query())
        Prepared statements not in 1.0.0-prototype
        (mysqli_stmt_*())
The speaker says...
PECL/mysqlnd_mux 1.0.0-prototype is an example of the
strenghts of the mysqlnd C plugin API. The initial public
release is not a production-ready stable solution. Features
have been skipped for the prototype to keep the
demo of the plugin API short and comprehensive.


The astonishing finding of the plugin is that multiplexing
can be added to add PHP MySQL APIs without
changing the APIs. It just works – for some cases already
today. Other cases could be covered in future
versions, depending on user feedback.
THAT'S IT FOLKS?
Compared to pooling
●
    Connection remains open after close()
        Connection establishment overhead reduced
        Number of concurrent connections not reduced
        Usually, connection state reset upon reuse
                  Client                Client


                     Connection pool


            Connection     Connection     Connection


                            MySQL
The speaker says...
A connection pool is a cache for connections. If a
client openes a connection, the pool is checked for an
already estiablished connection to the requested host. In
case of a hit, the pooled connection is reset, then taken from
the pool of unused connections and returned to the client. If
no connection is found a new one gets opened and returned
to the caller. Then, the connection is used until the client
calls close(). Upon close(), the connection is not closed but
put back into the pool for reuse.


Pooling saves time on reuse but does not reduce the total
number of concurrent connections.
Persistent Connection
●
    Connection remains open after close()
         Connection overhead and reuse costs reduced
         Number of concurrent connections not reduced
         Connection state not reset before reuse

    Client 1               Pool    Connection 1     MySQL

               SET @myvar = 1

    Client 2               Pool    Connection 1     MySQL

               SELECT @myvar
The speaker says...
Persistent connections can be described as a special kind of
 pooled connections. As the name says, the state of a
persistent connection is not reset between use .
PHP persistent database connections have often been
criticised for persisting the state of a connection... - for their
very purpose!


Thus, when „persistent connections“ have been added to the
mysqli extension, mysqli actually got pooled
connections. By default, the connection state is
reset before reuse. Performance fanatics can disable this
during compile time.
Speed-up tricks compared
●
    Every optimization is a trade
         You gain something: fewer connections opened
         You give something: collision possible
         You gain something: lower connection costs
         You give something: no isolation of connection state
                                              MUX   Pooled   Pers. Conn
                                                     Conn.
Reduce connection overhead                    Yes     Yes            Yes
Reduce # concurrently open connections        Yes      No             No
Connection state shared among clients         Yes      No            Yes
                                                             (mysqli: No)
Serialization required, collisions possible   Yes      No             No
The speaker says...
Optimizations, such as multiplexing, pooling or persistent
connections come at a price. There is no one-fits all trick.


Please, try to understand the properties of each
option. Then, decide on a case-by-case basis
which technology to use.
Remember: scope/life-span
●
    Pools are bound to a PHP process
       Depending on deployment model,
       a PHP process handles one or multiple requests


                     HTTP Server

          PHP process          PHP process

         Connection pool     Connection pool

         Conn 1   Conn 2    Conn 3    Conn 4
The speaker says...
Operating systems associate file descriptors, including
network connections, with processes. At the end of the
process, the network connections are closed. Thus, the
life-span of every client-side cache/pool of a PHP
process is that of the PHP process. No matter
whether we are discussing connections cached for
multiplexing or persistent connections as found in
any of the PHP MySQL APIs (mysql, mysqli,
PDO_MySQL).


Depending on the web server deployment model, a PHP
process handles one or multiple requests (script runs).
THE END



      http://www.slideshare.net/nixnutz/
Contact: ulf.wendel@oracle.com, @Ulf_Wendel

More Related Content

What's hot (20)

ODP
MySQL 5.7 Fabric: Introduction to High Availability and Sharding
Ulf Wendel
 
ODP
Vote NO for MySQL
Ulf Wendel
 
ODP
MySQL? Load? Clustering! Balancing! PECL/mysqlnd_ms 1.4
Ulf Wendel
 
ODP
Built-in query caching for all PHP MySQL extensions/APIs
Ulf Wendel
 
PDF
HTTP Plugin for MySQL!
Ulf Wendel
 
ODP
MySQL 5.7 clustering: The developer perspective
Ulf Wendel
 
ODP
PoC: Using a Group Communication System to improve MySQL Replication HA
Ulf Wendel
 
PDF
DIY: A distributed database cluster, or: MySQL Cluster
Ulf Wendel
 
ODP
MySQL Group Replication
Ulf Wendel
 
ODP
Award-winning technology: Oxid loves the query cache
Ulf Wendel
 
PDF
Highly Available MySQL/PHP Applications with mysqlnd
Jervin Real
 
PDF
MySQL Group Replication
Bogdan Kecman
 
PPTX
Active mq Installation and Master Slave setup
Ramakrishna Narkedamilli
 
PDF
Introduction to Galera
Henrik Ingo
 
PPTX
MySQL Multi Master Replication
Moshe Kaplan
 
PPT
Mysql high availability and scalability
yin gong
 
PDF
MySQL X protocol - Talking to MySQL Directly over the Wire
Simon J Mudd
 
PDF
Scaling with sync_replication using Galera and EC2
Marco Tusa
 
PDF
MySQL Database Architectures - InnoDB ReplicaSet & Cluster
Kenny Gryp
 
PDF
Introduction to Galera Cluster
Codership Oy - Creators of Galera Cluster
 
MySQL 5.7 Fabric: Introduction to High Availability and Sharding
Ulf Wendel
 
Vote NO for MySQL
Ulf Wendel
 
MySQL? Load? Clustering! Balancing! PECL/mysqlnd_ms 1.4
Ulf Wendel
 
Built-in query caching for all PHP MySQL extensions/APIs
Ulf Wendel
 
HTTP Plugin for MySQL!
Ulf Wendel
 
MySQL 5.7 clustering: The developer perspective
Ulf Wendel
 
PoC: Using a Group Communication System to improve MySQL Replication HA
Ulf Wendel
 
DIY: A distributed database cluster, or: MySQL Cluster
Ulf Wendel
 
MySQL Group Replication
Ulf Wendel
 
Award-winning technology: Oxid loves the query cache
Ulf Wendel
 
Highly Available MySQL/PHP Applications with mysqlnd
Jervin Real
 
MySQL Group Replication
Bogdan Kecman
 
Active mq Installation and Master Slave setup
Ramakrishna Narkedamilli
 
Introduction to Galera
Henrik Ingo
 
MySQL Multi Master Replication
Moshe Kaplan
 
Mysql high availability and scalability
yin gong
 
MySQL X protocol - Talking to MySQL Directly over the Wire
Simon J Mudd
 
Scaling with sync_replication using Galera and EC2
Marco Tusa
 
MySQL Database Architectures - InnoDB ReplicaSet & Cluster
Kenny Gryp
 
Introduction to Galera Cluster
Codership Oy - Creators of Galera Cluster
 

Viewers also liked (12)

ODP
The power of mysqlnd plugins
Ulf Wendel
 
PPTX
Lecture#04, use case diagram
babak danyal
 
PPT
Lecture #5 Data Communication and Network
vasanthimuniasamy
 
ODP
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
Ulf Wendel
 
PPT
Use case-diagrams
Maoelana Noermoehammad
 
PDF
Advance Web Designing - Lecture 02 / 30
alishanvr
 
PPT
Hospital as an organisation
Nc Das
 
DOC
Censo mpps analisis
BLANCA JOSEFINA ROBERTIS CHAVEZ
 
PDF
Advance Web Designing - Lecture 1 / 30
alishanvr
 
PDF
Node.js and The Internet of Things
Losant
 
PPTX
Data communication and network Chapter -1
Zafar Ayub
 
PPT
Object-Oriented Analysis & Design (OOAD) Domain Modeling Introduction
Dang Tuan
 
The power of mysqlnd plugins
Ulf Wendel
 
Lecture#04, use case diagram
babak danyal
 
Lecture #5 Data Communication and Network
vasanthimuniasamy
 
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
Ulf Wendel
 
Use case-diagrams
Maoelana Noermoehammad
 
Advance Web Designing - Lecture 02 / 30
alishanvr
 
Hospital as an organisation
Nc Das
 
Censo mpps analisis
BLANCA JOSEFINA ROBERTIS CHAVEZ
 
Advance Web Designing - Lecture 1 / 30
alishanvr
 
Node.js and The Internet of Things
Losant
 
Data communication and network Chapter -1
Zafar Ayub
 
Object-Oriented Analysis & Design (OOAD) Domain Modeling Introduction
Dang Tuan
 
Ad

Similar to PHP mysqlnd connection multiplexing plugin (20)

PDF
Mysqlnd, an unknown powerful PHP extension
julien pauli
 
PDF
Talon systems - Distributed multi master replication strategy
Saptarshi Chatterjee
 
PDF
Midwest PHP Presentation - New MSQL Features
Dave Stokes
 
PDF
Reactive Applications with Apache Pulsar and Spring Boot
VMware Tanzu
 
PDF
Performance evaluation of larger matrices over cluster of four nodes using mpi
eSAT Journals
 
PDF
A Domain-Specific Embedded Language for Programming Parallel Architectures.
Jason Hearne-McGuiness
 
PDF
ProxySQL Tutorial - PLAM 2016
Derek Downey
 
PDF
Concurrency and parallel in .net
Mohammad Hossein Karami
 
PDF
Pydbapi
AkramWaseem
 
PDF
Clustering Multiple Instances in Cold Fusion
Mindfire Solutions
 
PDF
MOOC backbone using Netty and Protobuf
Gaurav Bhardwaj
 
PDF
MySQL PHP native driver : Advanced Functions / PHP forum Paris 2013
Serge Frezefond
 
PPT
thread_ multiprocessor_ scheduling_a.ppt
naghamallella
 
PPTX
Develop PHP Applications with MySQL X DevAPI
Dave Stokes
 
PDF
Express node js
Yashprit Singh
 
PPTX
Topic 4- processes.pptx
DanishMahmood23
 
PPTX
Software architecture for data applications
Ding Li
 
PPT
Client Centric Consistency Model
Rajat Kumar
 
PDF
PHP Basics
Roohul Amin
 
PPTX
Reactive programming intro
Ahmed Ehab AbdulAziz
 
Mysqlnd, an unknown powerful PHP extension
julien pauli
 
Talon systems - Distributed multi master replication strategy
Saptarshi Chatterjee
 
Midwest PHP Presentation - New MSQL Features
Dave Stokes
 
Reactive Applications with Apache Pulsar and Spring Boot
VMware Tanzu
 
Performance evaluation of larger matrices over cluster of four nodes using mpi
eSAT Journals
 
A Domain-Specific Embedded Language for Programming Parallel Architectures.
Jason Hearne-McGuiness
 
ProxySQL Tutorial - PLAM 2016
Derek Downey
 
Concurrency and parallel in .net
Mohammad Hossein Karami
 
Pydbapi
AkramWaseem
 
Clustering Multiple Instances in Cold Fusion
Mindfire Solutions
 
MOOC backbone using Netty and Protobuf
Gaurav Bhardwaj
 
MySQL PHP native driver : Advanced Functions / PHP forum Paris 2013
Serge Frezefond
 
thread_ multiprocessor_ scheduling_a.ppt
naghamallella
 
Develop PHP Applications with MySQL X DevAPI
Dave Stokes
 
Express node js
Yashprit Singh
 
Topic 4- processes.pptx
DanishMahmood23
 
Software architecture for data applications
Ding Li
 
Client Centric Consistency Model
Rajat Kumar
 
PHP Basics
Roohul Amin
 
Reactive programming intro
Ahmed Ehab AbdulAziz
 
Ad

Recently uploaded (20)

PPTX
Wondershare Filmora Crack Free Download 2025
josanj305
 
PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PDF
5 Things to Consider When Deploying AI in Your Enterprise
Safe Software
 
PDF
FME in Overdrive: Unleashing the Power of Parallel Processing
Safe Software
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
TrustArc Webinar - Navigating APAC Data Privacy Laws: Compliance & Challenges
TrustArc
 
PDF
How to Comply With Saudi Arabia’s National Cybersecurity Regulations.pdf
Bluechip Advanced Technologies
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
PDF
Quantum Threats Are Closer Than You Think – Act Now to Stay Secure
WSO2
 
PDF
Hello I'm "AI" Your New _________________
Dr. Tathagat Varma
 
PDF
GDG Cloud Southlake #44: Eyal Bukchin: Tightening the Kubernetes Feedback Loo...
James Anderson
 
PDF
Bitkom eIDAS Summit | European Business Wallet: Use Cases, Macroeconomics, an...
Carsten Stoecker
 
PDF
Next Generation AI: Anticipatory Intelligence, Forecasting Inflection Points ...
dleka294658677
 
PDF
Draugnet: Anonymous Threat Reporting for a World on Fire
treyka
 
PPTX
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
PDF
Governing Geospatial Data at Scale: Optimizing ArcGIS Online with FME in Envi...
Safe Software
 
PPTX
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
PDF
Optimizing the trajectory of a wheel loader working in short loading cycles
Reno Filla
 
PDF
DoS Attack vs DDoS Attack_ The Silent Wars of the Internet.pdf
CyberPro Magazine
 
PDF
🚀 Let’s Build Our First Slack Workflow! 🔧.pdf
SanjeetMishra29
 
Wondershare Filmora Crack Free Download 2025
josanj305
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
5 Things to Consider When Deploying AI in Your Enterprise
Safe Software
 
FME in Overdrive: Unleashing the Power of Parallel Processing
Safe Software
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
TrustArc Webinar - Navigating APAC Data Privacy Laws: Compliance & Challenges
TrustArc
 
How to Comply With Saudi Arabia’s National Cybersecurity Regulations.pdf
Bluechip Advanced Technologies
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
Quantum Threats Are Closer Than You Think – Act Now to Stay Secure
WSO2
 
Hello I'm "AI" Your New _________________
Dr. Tathagat Varma
 
GDG Cloud Southlake #44: Eyal Bukchin: Tightening the Kubernetes Feedback Loo...
James Anderson
 
Bitkom eIDAS Summit | European Business Wallet: Use Cases, Macroeconomics, an...
Carsten Stoecker
 
Next Generation AI: Anticipatory Intelligence, Forecasting Inflection Points ...
dleka294658677
 
Draugnet: Anonymous Threat Reporting for a World on Fire
treyka
 
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
Governing Geospatial Data at Scale: Optimizing ArcGIS Online with FME in Envi...
Safe Software
 
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
Optimizing the trajectory of a wheel loader working in short loading cycles
Reno Filla
 
DoS Attack vs DDoS Attack_ The Silent Wars of the Internet.pdf
CyberPro Magazine
 
🚀 Let’s Build Our First Slack Workflow! 🔧.pdf
SanjeetMishra29
 

PHP mysqlnd connection multiplexing plugin

  • 1. Ulf Wendel, Oracle PHP mysqlnd Connection Multiplexing PECL/mysqlnd_mux 1.0.0-prototype
  • 2. The speaker says... When fast is not fast enough, you pull all triggers. This includes attempts to optimize an already reasonable fast operation: connect time to MySQL. The PHP mysqlnd connection multiplexing plugin, shares a physical connection among multiple user handles. Thus, connection overhead is saved on the client side and the number of opened connection is reduced on the server side. PECL/mysqlnd_mux is an Oracle open source development available from pecl.php.net. Developed by Andrey Hristov.
  • 3. Plugins are mostly transparent WordPress, Drupal, Symfony, Oxid, ZendFramework, ... mysql, mysqli, PDO_MYSQL mysqlnd PECL/mysqlnd_mux plugin Connection Multiplexing MySQL Server
  • 4. The speaker says... PECL/mysqlnd_mux is a plugin for the mysqlnd library. The mysqlnd library is the default C client library used by the PHP MySQL extensions mysql, mysqli and PDO_MySQL internally. Mysqlnd ships with PHP since 5.3. Plugins operate at a layer beneath the user APIs, thus improvements are available to all PHP MySQL APIs. Other free plugins are PECL/mysqlnd_ms (replication and load balancing), PECL/mysqlnd_qc (client-side query cache) and many more.
  • 5. PECL/mysqlnd_mux ● Multiplexing: share connection among handles Reduce client connect overhead, reduce server load Prototype, requires PHP 5.5.0+ connect() connect() connect() n connection handles PECL/mysqlnd_mux 1 connection MySQL
  • 6. The speaker says... The PHP mysqlnd connection multiplexing proxies MySQL connections. Whenever a client attempts to open a connection to a host, the plugin checks whether there is already a cached network connection to the host in question. If not, a new connection is established and associated with the users' connection handle. Otherwise, the users' connection handle is linked with an already opened network connection. This way, multiple user handles can point to the same network connection and share it. Connection overhead is saved and fewer connections are opened.
  • 7. The price you pay ● Multiplexing means serializing tasks Possibility of wait situations Prototype: no upgrade to dedicated connection Prototype: no collision counter Query 1 MUX Query 1 Query 2 MySQL Query 2 Time
  • 8. The speaker says... Sharing a resource often requires serializing access to it. This is also the case with a shared connection of the PHP mysqlnd connection multiplexing plugin. Serializing actions bares the risks of collisions and wait situations. In the example, a clients query has to wait for completion of another clients query before it can be executed. Query 2 waits for query 1 to finish. The prototype is using a mutex to synchronize access to a shared connection.
  • 9. MUX as a demo of the plugin API ● No new API calls, it just works! Supports popular buffered queries (mysql_query(), mysqli_query(), PDO if using PDO::ATTR_EMULATE_PREPARES) Prototype does not handle unbuffered queries (mysqli_real_query()) Prepared statements not in 1.0.0-prototype (mysqli_stmt_*())
  • 10. The speaker says... PECL/mysqlnd_mux 1.0.0-prototype is an example of the strenghts of the mysqlnd C plugin API. The initial public release is not a production-ready stable solution. Features have been skipped for the prototype to keep the demo of the plugin API short and comprehensive. The astonishing finding of the plugin is that multiplexing can be added to add PHP MySQL APIs without changing the APIs. It just works – for some cases already today. Other cases could be covered in future versions, depending on user feedback.
  • 12. Compared to pooling ● Connection remains open after close() Connection establishment overhead reduced Number of concurrent connections not reduced Usually, connection state reset upon reuse Client Client Connection pool Connection Connection Connection MySQL
  • 13. The speaker says... A connection pool is a cache for connections. If a client openes a connection, the pool is checked for an already estiablished connection to the requested host. In case of a hit, the pooled connection is reset, then taken from the pool of unused connections and returned to the client. If no connection is found a new one gets opened and returned to the caller. Then, the connection is used until the client calls close(). Upon close(), the connection is not closed but put back into the pool for reuse. Pooling saves time on reuse but does not reduce the total number of concurrent connections.
  • 14. Persistent Connection ● Connection remains open after close() Connection overhead and reuse costs reduced Number of concurrent connections not reduced Connection state not reset before reuse Client 1 Pool Connection 1 MySQL SET @myvar = 1 Client 2 Pool Connection 1 MySQL SELECT @myvar
  • 15. The speaker says... Persistent connections can be described as a special kind of pooled connections. As the name says, the state of a persistent connection is not reset between use . PHP persistent database connections have often been criticised for persisting the state of a connection... - for their very purpose! Thus, when „persistent connections“ have been added to the mysqli extension, mysqli actually got pooled connections. By default, the connection state is reset before reuse. Performance fanatics can disable this during compile time.
  • 16. Speed-up tricks compared ● Every optimization is a trade You gain something: fewer connections opened You give something: collision possible You gain something: lower connection costs You give something: no isolation of connection state MUX Pooled Pers. Conn Conn. Reduce connection overhead Yes Yes Yes Reduce # concurrently open connections Yes No No Connection state shared among clients Yes No Yes (mysqli: No) Serialization required, collisions possible Yes No No
  • 17. The speaker says... Optimizations, such as multiplexing, pooling or persistent connections come at a price. There is no one-fits all trick. Please, try to understand the properties of each option. Then, decide on a case-by-case basis which technology to use.
  • 18. Remember: scope/life-span ● Pools are bound to a PHP process Depending on deployment model, a PHP process handles one or multiple requests HTTP Server PHP process PHP process Connection pool Connection pool Conn 1 Conn 2 Conn 3 Conn 4
  • 19. The speaker says... Operating systems associate file descriptors, including network connections, with processes. At the end of the process, the network connections are closed. Thus, the life-span of every client-side cache/pool of a PHP process is that of the PHP process. No matter whether we are discussing connections cached for multiplexing or persistent connections as found in any of the PHP MySQL APIs (mysql, mysqli, PDO_MySQL). Depending on the web server deployment model, a PHP process handles one or multiple requests (script runs).
  • 20. THE END http://www.slideshare.net/nixnutz/ Contact: [email protected], @Ulf_Wendel