데이터를 좀 뽑을 일이 있어서 쿼리를 짜는 와중에, 자연스럽게 ROW_NUMBER 함수를 썻다가 Syntax Error 가 나는 것을 보고 ?를 띄우며 당황스러움을 감추지 못했다.
SELECT t.*
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY week_num, ranking_type ORDER BY score DESC) AS rn
FROM (
SELECT *,
YEAR(created_at) AS year_num,
WEEK(created_at) AS week_num
FROM your_table_name
WHERE YEAR(created_at) = 2022
) AS subquery
) AS t
WHERE t.rn <= 3
ORDER BY t.week_num, t.ranking_type, t.score DESC;
그래서 이런 ROW_NUMBER 함수는 변환해서 써줘야 하는데,
이런 경우에는 JOIN 이 매우매우 좋다.
따라서 JOIN 으로 뿌셔버리고 해당 부분에 대한 문제를 해결해줫다.
물론 번외로 MySQL 8.0 에서는 지원이 된다고 하니 버전업을 읏샤읏샤 해버리고 싶다만은.. 그게 그렇게 간단한 일이 아니잖아?
How To Optimize WordPress Performance With MySQL Replication On Ubuntu 14.04
Introduction
In this tutorial, we will teach you how to scale up your WordPress MySQL database server setup using master-slave database replication and the HyperDB plugin for WordPress. Adding more database servers to your environment in this manner allows your WordPress application to read from multiple database servers, increasing read performance.
MySQL replication reaps the most performance benefits for a system that processes frequent reads and infrequent writes, like most WordPress installations. By using a single-master with multiple-slave setup, you can add more slaves to scale your system, until you run out of network bandwidth or your master cannot handle the update load. If you wish, you can add more than one slaves by repeating the “slave” portions of the replication sections of this tutorial.
We are assuming that your setup includes two load balanced WordPress application servers that connect to a separate MySQL database server (see the prerequisites for a tutorial on how to set that up). It is not strictly necessary to have load balanced application servers to follow this tutorial, but your MySQL database server should be separate from your application servers.
Prerequisites
Before continuing with this tutorial, you should have completed two tutorials or have a similar environment:
After following those tutorials, to set up WordPress with two load balanced web application servers and a separate database server, you should have four VPSs. Because we will be dealing with several VPSs, for reference purposes, we will call your four existing VPSs the following:
haproxy-www: Your HAProxy server for layer 4 load balancing your WordPress web application servers. This is the entry point into your website
wordpress-1: Your first WordPress web application server
wordpress-2: Your second WordPress web application server
mysql-1: Your MySQL server for WordPress
That is, your environment should look something like this:
In addition to your current environment, we will require one additional VPS during this tutorial. We will call it:
mysql-2: Your slave MySQL database server
Our Goal
When we are finished with this tutorial, you will have two database servers will be replicating in a master-slave configuration. Your WordPress servers will selectively write to your master and read from both your master and slave databases, by use of the HyperDB WordPress plugin. Your final environment should look something like this:
Keep in mind that you do not need to have load balanced application servers (wordpress-1/wordpress-2) to follow this tutorial, and that you can add more slave databases if you want.
Set Up MySQL Master-Slave Replication
Before we can configure our WordPress application to read from multiple database servers, we need to set up our MySQL replication.
Create MySQL Slave VPS, mysql-2
You will want to create a new VPS that will act as the MySQL slave server–for reference purposes, we will call this servermysql-2. The slave will be configured to replicate all of the databases of your master MySQL server, including your WordPress database.
bind-address: the IP address that MySQL will listen on. This should already be set tomysql-1’s private IP address from your original setup
server-id: the unique server ID. Since this is the master server, we will want to leave the value as “1” and uncomment this line
log_bin: the location of the binary log file. The binary log is used to send data changes from the master to its slave for replication. Uncomment this line
The three lines should look like this (be sure to substitute the highlighted with database server’s private IP address):
Optionally, if you want to restrict the replication to thewordpressdatabase, specifically, add the following line to your configuration (substituting the highlighted with your desired database name):
Save and quit. To put these changes into effect, restart mysql with the following command:
sudo service mysql restart
Connect to to the MySQL console with the following command, then enter the password when prompted:
mysql -u root -p
Create a user that will be used by our slave MySQL servers for replication purposes. We will call this userrepl. Be sure to replace therepl_passwordwith your own, strong password. The%specifies that the source IP for this user can be anything, but you may substitute the%with the private IP address of your slave MySQL server,mysql-2, to restrict connections with this user to that particular server:
<pre> CREATE USER ‘repl’@’<span class=“highlight”>%</span>’ IDENTIFIED BY ’<span class=“highlight”>repl_password</span>’; GRANT REPLICATION SLAVE ON.TO 'repl’@’%’; </pre>
Do not exit the MySQL console yet!
Export a Backup Of MySQL Master
Next, we will want to export a backup of the MySQL master database, to import into our slave database so it will be identical before we start replication. We need to lock the database so we can do a data dump. In your MySQL console onmysql-1, run this:
FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON; EXIT
Now, from your command shell, run the following command to export a backup of the databases on your master MySQL server to a file calledmasterdump.sql:
Save and quit. Restart MySQL to put the changes into effect:
sudo service mysql restart
Enter the MySQL console:
mysql -u root -p
Next, we will connect the slave to the master. The five following values are required:
MASTER_HOST: set to mysql-1’s private IP
MASTER_USER: set to the replication user that we created on the master,repl
MASTER_PASSWORD: set torepl’s password, which should be substituted with your own password
MASTERLOGFILE: set to the “File” listed when you ranSHOW MASTER STATUS;on your master MySQL server
MASTERLOGPOS: set to the “Position” listed when you ranSHOW MASTER STATUS;on your master MySQL server
The following statement connects your slave to your master server, and it requires that you substitute all of the highlighted fields with the appropriate values:
If that statement ran properly, run this command to initiate the slave connection:
START SLAVE;
Yourmysql-2server should be connected as a slave now! Run the following command to check that the replication is working:
SHOW SLAVE STATUS\G
Revoke Write Privileges From Slave Users
This is optional because the HyperDB plugin can be configured to only read from your slave database server, but you may want revoke the write privileges from yourwordpressuserdatabase users on your slave database (because updates to your slave will not be replicated to your master, if you accidentally update your slave somehow).
On mysql-2, from your MySQL console run the following statement to list your database users:
You should see output similar to the above code block. You may view privileges for each user with the following command:
<pre> SHOW GRANTS FOR <span class=“highlight”>wordpressuser</span>@<span class=“highlight”>wordpress1IP</span>; </pre>
In this example, we have onewordpressuserfor each WordPress server, so we will revoke theinsert,update, anddeleteprivileges from each of them (“wordpress” is the name of our database in this example):
<pre> REVOKE INSERT, UPDATE, DELETE ON <span class=“highlight”>wordpress</span>.* FROM ’<span class=“highlight”>wordpressuser</span>’@’<span class=“highlight”>wordpress1privateIP</span>’; REVOKE INSERT, UPDATE, DELETE ON <span class=“highlight”>wordpress</span>.* FROM ’<span class=“highlight”>wordpressuser</span>’@’<span class=“highlight”>wordpress2privateIP</span>’; FLUSH PRIVILEGES; </pre>
Now your MySQL replication setup is complete. Let’s move on to setting up WordPress to use both database servers properly.
Install and Configure HyperDB
We will use HyperDB to determine where to send updates (your master database) and read requests (your master and slave). Let’s download it to your home directory from the WordPress Plugin Directory (also install zip/unzip to unarchive it):
It should be unarchived to a directory called “hyperdb”, in your home directory. Copy the sample configuration file to your WordPress installation (substitute the highlighted with your WordPress installation path), and open it for editing:
<pre> cp ~/hyperdb/db-config.php <span class=“highlight”>/var/www/example.com</span>/ vi <span class=“highlight”>/var/www/example.com</span>/db-config.php</pre>
Look for thesecond occurrenceofDB_HOST, which should be directly after some comments that describe setting up a slave and it should look exactly like the following:
<pre> $wpdb->adddatabase(array( 'host’ => <span class=“highlight”>DBHOST</span>, // If port is other than 3306, use host:port. 'user’ => DBUSER, 'password’ => DBPASSWORD, 'name’ => DB_NAME, 'write’ => 0,'read’ => 1,'dataset’ => 'global’,'timeout’ => 0.2,));</pre>
The first occurrence of DBHOST defines the master database server, and the second occurrence defines the slave database server (denoted by the'write' => 0,). Replace the second occurrence of `DBHOSTwithDBSLAVE1`:
<pre> 'host’ => <span class=“highlight”>DBSLAVE1</span>, // If port is other than 3306, use host:port. </pre>
Save and exit. Next you will want to defineDB_SLAVE_1in your wp-config.php, which HyperDB will use as a slave database host. Open wp-config.php for editing:
<pre> vi <span class=“highlight”>/var/www/example.com</span>/wp-config.php </pre>
Find the line that definesDB_HOSTand add the following line under it, substituting your slave’s private IP address (mysql-2):
Then update the ownership of your wordpress files to their appropriate values (in this tutorial, we have been usingwww-datafor the user/group ownership):
Now your WordPress read requests will be served by both your master and slave databases, while updates will be sent to your master (which will then be replicated to your slave).
Conclusion
Now that you have completed your MySQL replication and HyperDB setup, your database environment will be able to handle increased read traffic i.e. more concurrent users! Remember that you can add more MySQL slaves if you want to scale your database serving capacity even more.