# Routing Statements with MaxScale's Read/Write Split Router

The [Read/Write Split Router (readwritesplit)](https://mariadb.com/docs/maxscale/reference/maxscale-routers/maxscale-readwritesplit) uses well-defined rules to determine whether a statement can be routed to a replica server, or whether it needs to be routed to the primary server. Application designers must understand these rules to ensure that the router can properly load balance queries.

## Statements Routed to the Primary Server

The following statements are routed to the primary server:

* Queries that write to the database. For example, this includes, but is not limited to, the following statements:
  * [INSERT](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/inserting-loading-data/insert.md)
  * [INSERT ... RETURNING](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/inserting-loading-data/insertreturning.md)
  * [UPDATE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/changing-deleting-data/update.md)
  * [DELETE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/changing-deleting-data/delete.md)
  * [REPLACE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/changing-deleting-data/replace.md)
  * [REPLACE ... RETURNING](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/changing-deleting-data/replacereturning.md)
  * [LOAD DATA INFILE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/inserting-loading-data/load-data-into-tables-or-index/load-data-infile.md)
* Queries that modify the database (DDL) For example, this includes, but is not limited to, the following statements:
  * [CREATE DATABASE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/create/create-database.md)
  * [ALTER DATABASE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/alter/alter-database.md)
  * [DROP DATABASE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/drop/drop-database.md)
  * [CREATE TABLE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/create/create-table.md)
  * [ALTER TABLE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/alter/alter-table/README.md)
  * [DROP TABLE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/drop/drop-table.md)
  * [CREATE VIEW](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/views/create-view.md)
  * [ALTER VIEW](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/views/alter-view.md)
  * [DROP VIEW](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/views/drop-view.md)
  * [CREATE SEQUENCE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-structure/sequences/create-sequence.md)
  * [ALTER SEQUENCE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-structure/sequences/alter-sequence.md)
  * [DROP SEQUENCE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-structure/sequences/drop-sequence.md)
  * [CREATE TRIGGER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/triggers-events/triggers/create-trigger.md)
  * [DROP TRIGGER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/drop/drop-trigger.md)
  * [CREATE PROCEDURE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/stored-routines/stored-procedures/create-procedure.md)
  * [ALTER PROCEDURE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/stored-routines/stored-procedures/alter-procedure.md)
  * [DROP PROCEDURE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/stored-routines/stored-procedures/drop-procedure.md)
  * [CREATE FUNCTION](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/create/create-function.md)
  * [ALTER FUNCTION](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-definition/alter/alter-function.md)
  * [DROP FUNCTION](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/server-usage/stored-routines/stored-functions/drop-function.md)
  * [CREATE USER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/account-management-sql-statements/create-user.md)
  * [ALTER USER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/account-management-sql-statements/alter-user.md)
  * [DROP USER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/account-management-sql-statements/drop-user.md)
  * [CREATE ROLE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/account-management-sql-statements/create-role.md)
  * [DROP ROLE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/account-management-sql-statements/drop-role.md)
* Queries within open transactions If the application uses explicit transactions, then all queries within the transaction will be routed to the primary server. Explicit transactions are used in the following cases:
  * When [autocommit](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/ha-and-performance/optimization-and-tuning/system-variables/server-system-variables.md#autocommit) is set to OFF.
  * When [BEGIN](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/transactions/start-transaction.md) is executed.
  * When [START TRANSACTION](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/transactions/start-transaction.md) is executed.

For example, all queries will be routed to the primary server in this case:

```
SET SESSION autocommit=OFF;
SELECT * FROM hq_sales.invoices WHERE branch_id=1;
INSERT INTO hq_sales.invoices
   (customer_id, invoice_date, invoice_total, payment_method)
VALUES
   (1, '2020-05-10 12:35:10', 1087.23, 'CREDIT_CARD');
COMMIT;
```

And all queries will also be routed to the primary server in this case:

```
BEGIN;
SELECT * FROM hq_sales.invoices WHERE branch_id=1;
INSERT INTO hq_sales.invoices
   (customer_id, invoice_date, invoice_total, payment_method)
VALUES
   (1, '2020-05-10 12:35:10', 1087.23, 'CREDIT_CARD');
COMMIT;
```

* Queries using stored procedures
* Queries using stored functions
* Queries using user-defined functions (UDF)
* Queries that use temporary tables
* [EXECUTE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/prepared-statements/execute-statement.md) statements that execute prepared statements

## Statements Routed to a Replica Server

The following statements are routed to a replica server:

* Queries that are read-only For example, this includes, but is not limited to, the following statements:
  * [SELECT](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/data-manipulation/selecting-data/select.md)
* Queries that read system or user-defined variables For example, this includes, but is not limited to, the following statements:
  * [SHOW CHARACTER SET](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-character-set.md)
  * [SHOW COLLATION](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-collation.md)
  * [SHOW COLUMNS](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-columns.md)
  * [SHOW CREATE DATABASE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-database.md)
  * [SHOW CREATE FUNCTION](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-function.md)
  * [SHOW CREATE PROCEDURE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-procedure.md)
  * [SHOW CREATE SEQUENCE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-sequence.md)
  * [SHOW CREATE TABLE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-table.md)
  * [SHOW CREATE TRIGGER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-trigger.md)
  * [SHOW CREATE USER](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-user.md)
  * [SHOW CREATE VIEW](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-create-view.md)
  * [SHOW DATABASES](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-databases.md)
  * [SHOW ENGINES](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-engine.md)
  * [SHOW TABLES](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-tables.md)
  * [SHOW VARIABLES](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/show/show-variables.md)

For example, the following queries would be routed to a replica:

```
SELECT @@global.alter_algorithm;
SELECT @@my_user_var;
SHOW statements
```

* Queries using built-in functions

## Statements Routed to All Servers

The following statements are routed to all servers:

* [SET](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/set-commands/set.md) statements, including those embedded in read-only statements
* [USE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/administrative-sql-statements/use-database.md) statements
* [PREPARE](https://github.com/mariadb-corporation/mariadb-docs/blob/main/server/reference/sql-statements/prepared-statements/prepare-statement.md) statements that create prepared statements
* Internal client commands, such as `QUIT, PING, STMT RESET, and CHANGE USER`.

<sub>*This page is: Copyright © 2025 MariaDB. All rights reserved.*</sub>

{% @marketo/form formId="4316" %}
