Coder Social home page Coder Social logo

laravel-lazy-mysql's Introduction

Lazy MySQL

Implements a lazy MySQL database connection for Laravel that only connects to the individual read or write databases when they are actually used - by Zara 4 Only tested using Laravel 5.1

This assumes a set up where you have configured Laravel to use separate read and write MySQL database connections; and the write database is slow to connect, most likely due to a high latency connection caused by distance.

Zara 4 is a globally distributed image compression service, and currently uses the lazy-mysql database driver.

You can view our accompanying blog post for Laravel Lazy Read/Write Database Connection

Introduction

If you are deploying your Laravel application globally on multiple servers across the world, you will likely encounter issues with database connection latency. You can speed up read database queries using local MySQL database read replicas; however this does not overcome the delay caused by connecting to the write database if you have a single master write database in a remote location.

Database Replication Structure

The standard Laravel MySQL database driver connects to both the read and write databases specified in your configuration as soon as the connection is first used. The result is an unnecessary delay when you only want to read data from the database, Laravel still connects to the write database even though it isn't used.

Unlike the standard Laravel MySQL database driver, Lazy MySQL does not connect to the individual read or write databases until they are actually used by a query. A request that only reads data from your database (SELECT) will only connect to the read database. A request that only writes data to the database (INSERT, UPDATE, DELETE) will only connect to the write database.

Installation

Download

To install the Lazy MySQL driver into your laravel application run:

composer require zara-4/laravel-lazy-mysql

Enable Service Provider

Add the LazyMySql service provider to your application config/app.php

'providers' => [
  // ...

  Zara4\LazyMySql\ServiceProvider::class,

  // ...
],

Configuration

The lazy-mysql driver reads database configuration in exactly the same way as the standard Laravel MySQL database driver. Simply change the driver from mysql to lazy-mysql

'mysql' => [
  'read' => [
    'database'  => env('DB_READ_DATABASE', env('DB_DATABASE', 'default-database-name-goes-here')),
    'host'      => env('DB_READ_HOST', env('DB_HOST', 'default-read-database-host-goes-here')),
  ],
  'write' => [
    'database'  => env('DB_WRITE_DATABASE', env('DB_DATABASE', 'default-database-name-goes-here')),
    'host'      => env('DB_WRITE_HOST', env('DB_HOST', 'default-write-database-host-goes-here')),
    'options'   => [
      PDO::ATTR_PERSISTENT => true,
    ],
  ],
  'driver'    => 'lazy-mysql',
  'username'  => env('DB_USERNAME', 'default-username-goes-here'),
  'password'  => env('DB_PASSWORD', 'default-password-goes-here'),
  'port'      => env('DB_PORT', 3306),
  'charset'   => 'utf8',
  'collation' => 'utf8_unicode_ci',
  'prefix'    => '',
  'strict'    => false,
],

You can achieve significant additional speed improvements by ensuring the write connection is persistent. To do this ensure the connection has the PDO::ATTR_PERSISTENT => true option (as in the example above)

'options'   => [
  PDO::ATTR_PERSISTENT => true,
],

Results

Using the standard Laravel MySQL driver with a local MySQL read replica database and a remote MySQL write master database, took in excess of 500ms to connect and read a single record.

By enabling persistent connections with the PDO::ATTR_PERSISTENT => true option for the standard Laravel MySQL driver; the time to connect and read a single record was reduced to around 100ms to 150ms

By switching the database driver to lazy-mysql, the time to connect and read a single record was reduced to around 7ms to 15ms

The lazy-mysql database driver cannot overcome the delay caused when writing data to the remote master write database; however for requests that only ever read from the local read replica database, it can deliver significant performance improvements.

License

Lazy MySQL is open source and free - licensed under MIT.

laravel-lazy-mysql's People

Contributors

colin-stannard avatar

Stargazers

Osaigbovo Emmanuel avatar  avatar Henrik Sylvester Oddergaard avatar  avatar Sean Tymon avatar  avatar Lucian Daniliuc avatar Jeong-Hee Kang avatar haofly avatar Anton Paramonov avatar

Watchers

Ronalds avatar Thanos Theodorakopoulos avatar Anton Paramonov avatar James Cloos avatar Lucian Daniliuc avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.