Read-write splitting
Read-write splitting
Read-write splitting
The plugin executes read-only statements on the
configured MySQL slaves, and all other queries on the MySQL master.
Statements are considered read-only if they either start with
SELECT, the SQL hint /*ms=slave*/, or if a slave
had been chosen for running the previous query and the query starts
with the SQL hint /*ms=last_used*/. In all other cases,
the query will be sent to the MySQL replication master server. It
is recommended to use the constants
MYSQLND_MS_SLAVE_SWITCH
,
MYSQLND_MS_MASTER_SWITCH
and
MYSQLND_MS_LAST_USED_SWITCH
instead
of /*ms=slave*/. See also the list of mysqlnd_ms
constants.
SQL hints are a special kind of standard compliant
SQL comments. The plugin does check every statement for certain SQL
hints. The SQL hints are described within the mysqlnd_ms constants
documentation, constants that are exported by the extension. Other
systems involved with the statement processing, such as the MySQL
server, SQL firewalls, and SQL proxies, are unaffected by the SQL
hints, because those systems are designed to ignore SQL
comments.
The built-in read-write splitter can be replaced by
a user-defined filter, see also the user filter documentation.
A user-defined read-write splitter can request the
built-in logic to send a statement to a specific location, by
invoking mysqlnd_ms_is_select().
Note:
The built-in read-write splitter is not aware of
multi-statements. Multi-statements are seen as one statement. The
splitter will check the beginning of the statement to decide where
to run the statement. If, for example, a multi-statement begins
with SELECT 1 FROM DUAL; INSERT INTO test(id) VALUES (1);
… the plugin will run it on a slave although the statement
is not read-only.