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のパフォーマンスにバッククォートの有無は、関係ない!!