【MySQL】クォーテーションを付けたら、パフォーマンスが劇的に良くなるってホント?検証してみた
SQLのパフォーマンス改善について調べていると、 カラム名、テーブル名にバッククォート(`)をつけたら、データの取得速度が劇的に向上した! なんて記事を多々見かけます。 たったそれだけのことで劇的に早くなるのなら、書くしかない!となった筆者ですが、 一応テストデータを使用し、データの取得速度の比較を行ってみたいと思います。
検証方法
まずテスト用のデータベースを用意する。 定義は以下の通り。
CREATE TABLE `tests` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`column1` varchar(100) COLLATE utf8_unicode_ci,
`column2` varchar(100) COLLATE utf8_unicode_ci,
`column3` varchar(100) COLLATE utf8_unicode_ci,
`column4` varchar(100) COLLATE utf8_unicode_ci,
`column5` varchar(100) COLLATE utf8_unicode_ci,
`column6` varchar(100) COLLATE utf8_unicode_ci,
`column7` varchar(100) COLLATE utf8_unicode_ci,
`column8` varchar(100) COLLATE utf8_unicode_ci,
`column9` varchar(100) COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
そしてテストデータとしてinsertするものはこちら。
insert into tests values(
null,
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest',
'testtesttesttesttesttesttesttesttesttest');
このデータをttlを使用し、5万件insertしました。 なんか、こう…ぞわっとしますね。 今回はこれをテストデータとして利用します。 PHPで動かしているプロジェクト内で、 ajaxを使用し、10回連続で呼び出しを行った結果を比較します。
比較対象のメソッド
パターン1 バッククォートなし
public function get1(){
$sql =
"SELECT
id,column1,column2,column3,column4,column5,column6,column7,column8,column9
FROM tests;";
$data = $this->query($sql);
return $data;
}
パターン2 バッククォートあり
public function get2(){
$sql =
"SELECT
`id`,`column1`,`column2`,`column3`,`column4`,`column5`,`column6`,`column7`,`column8`,`column9`
FROM `tests`;";
$data = $this->query($sql);
return $data;
}
速度を比較する
ただ、「`」がついたというだけで速度が速くなるのか…。 ちょっと不安です。 一度目の測定結果 パターン1 クォートなし 28.55秒
パターン2 クォートあり 29.90秒
んんん…!? クォートを付けた時の方が、若干遅いですね…。 いや、でもそんなはずは… もう一度計測します。 二度目の測定結果 さっきは、調子が悪かっただけです。 きっと10秒ほどの差を出してくれることでしょう。 パターン1 クォートなし 29.01秒
パターン2 クォートあり 27.24秒
ほれ、きた! 1.77秒も縮まった! …微妙ですね。 その後、計測を続けるもはっきりとした速度の差は現れなかったです。
結論
SQLのパフォーマンスにバッククォートの有無は、関係ない!!