create table user(
id INT,
type INT,
name VARCHAR(255)
);
テストデータ作成用のプロシージャ作成
テストデータはプロシージャーで作成します。
以下の通りデータ作成してくれるようになっています。
user.id:カウントアップ形式で数値を格納
user.type:カウントを2で割った余りを格納(あまり意味がないカラムです。)
user.name:「user_name_{カウント}」の値を格納
-- 区切り文字を「//」に変更する
DELIMITER //
-- make_sample_dataというテストデータ作成用プロシージャーを作成する
create procedure make_sample_data(in i int)
begin
declare count int default 0;
-- 繰り返し
while count < i do
set count = count + 1;
INSERT INTO user VALUES(count, MOD(count,2),CONCAT('usr_name_',count));
end while;
end
//
-- 区切り文字を「;」に戻す
DELIMITER ;
それでは、クエリキャッシュON(MySQL5.7)の挙動から確認していきます。
クエリキャッシュON(MySQL5.7)の挙動
◾️クエリキャッシュがONであることの確認
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
1 row in set (0.01 sec)
mysql> select * from user where id = 1;
+------+------+------------+
| id | type | name |
+------+------+------------+
| 1 | 1 | usr_name_1 |
+------+------+------------+
1 row in set (0.47 sec)
mysql> select * from user where id = 1;
+------+------+------------+
| id | type | name |
+------+------+------------+
| 1 | 1 | usr_name_1 |
+------+------+------------+
1 row in set (0.02 sec)
mysql> select * from user where id = 1;
+------+------+------------+
| id | type | name |
+------+------+------------+
| 1 | 1 | usr_name_1 |
+------+------+------------+
1 row in set (0.01 sec)
◾️SELECT対象データをUPDATEする
mysql> update user set name = 'update_name' where id = 1;
Query OK, 0 rows affected (0.72 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> select * from user where id = 1;
+------+------+-------------+
| id | type | name |
+------+------+-------------+
| 1 | 1 | update_name |
+------+------+-------------+
1 row in set (0.45 sec)
mysql> select * from user where id = 1;
+------+------+-------------+
| id | type | name |
+------+------+-------------+
| 1 | 1 | update_name |
+------+------+-------------+
1 row in set (0.00 sec)
mysql> select * from user where id = 1;
+------+------+-------------+
| id | type | name |
+------+------+-------------+
| 1 | 1 | update_name |
+------+------+-------------+
1 row in set (0.00 sec)
次に、クエリキャッシュOFF(MySQL8.0)の挙動を確認していきます。
クエリキャッシュOFF(MySQL8.0)の挙動
◾️クエリキャッシュがOFFであることの確認
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | NO |
+------------------+-------+
1 row in set (0.00 sec)
mysql> select * from user where id = 1;
+------+------+------------+
| id | type | name |
+------+------+------------+
| 1 | 1 | usr_name_1 |
+------+------+------------+
1 row in set (0.57 sec)
mysql> select * from user where id = 1;
+------+------+------------+
| id | type | name |
+------+------+------------+
| 1 | 1 | usr_name_1 |
+------+------+------------+
1 row in set (0.55 sec)
mysql> select * from user where id = 1;
+------+------+------------+
| id | type | name |
+------+------+------------+
| 1 | 1 | usr_name_1 |
+------+------+------------+
1 row in set (0.58 sec)
◾️SELECT対象データをUPDATEする
mysql> update user set name = 'update_name' where id = 1;
Query OK, 1 row affected (0.90 sec)
Rows matched: 1 Changed: 1 Warnings: 0
◾️UPDATE後に再度、1件SELECTを3回やってみる
<結果>
1回目:0.55 sec→2回目:0.54 sec→3回目:0.54 sec
UPDATE後も変わらず、キャッシュが効かないため、速度が変わらないことが分かる
mysql> select * from user where id = 1;
+------+------+-------------+
| id | type | name |
+------+------+-------------+
| 1 | 1 | update_name |
+------+------+-------------+
1 row in set (0.55 sec)
mysql> select * from user where id = 1;
+------+------+-------------+
| id | type | name |
+------+------+-------------+
| 1 | 1 | update_name |
+------+------+-------------+
1 row in set (0.54 sec)
mysql> select * from user where id = 1;
+------+------+-------------+
| id | type | name |
+------+------+-------------+
| 1 | 1 | update_name |
+------+------+-------------+
1 row in set (0.54 sec)