IT速度比較

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