UJP - いくつかの全表走査にインデックスを足してみた

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

  • カテゴリ サイト運営 の最新配信
  • RSS
  • RDF
  • ATOM

ブログ - いくつかの全表走査にインデックスを足してみた

いくつかの全表走査にインデックスを足してみた

カテゴリ : 
サイト運営
ブロガー : 
ujpblog 2016/7/17 1:47
 デートを取っている期間が短いので,ビフォア,アフターで差分が出ないけれど,MRTGでステータスを取った結果をグラフ化してみたのがこんな感じ. 


 11時頃にSelect_scan(青色)の線が跳ねているけれど,これは幾つかのcreate indexを実行したので,当然と言えば当然.
 全表走査の「回数」が減ったかというと,そうならなかった.調べてみた方法と対策のメモ.
 Slow.logに出ていたSQL文はこれ.
SELECT FROM_UNIXTIME(published+0, '%Y%m') as thismonth, count(*) as entries
  FROM d3b_entry
  WHERE (uid=0 OR (approved=1 AND published+0 <= 1468641887))
  GROUP BY thismonth ORDER BY thismonth DESC LIMIT 12
 まずは,全表走査対象となったテーブルの構成を調べる.
mysql> desc d3b_entry;
+---------------+-----------------------+------+-----+---------+----------------+
| Field         | Type                  | Null | Key | Default | Extra          |
+---------------+-----------------------+------+-----+---------+----------------+
| bid           | int(8)                | NO   | PRI | NULL    | auto_increment |
| uid           | int(8)                | NO   | MUL | 0       |                |
| cid           | mediumint(5) unsigned | NO   | MUL | 0       |                |
| title         | varbinary(255)        | NO   |     |         |                |
| excerpt       | blob                  | NO   |     | NULL    |                |
| body          | blob                  | NO   |     | NULL    |                |
| dohtml        | tinyint(1) unsigned   | NO   |     | 0       |                |
| doxcode       | tinyint(1) unsigned   | NO   |     | 1       |                |
| doimage       | tinyint(1) unsigned   | NO   |     | 1       |                |
| dobr          | tinyint(1) unsigned   | NO   |     | 0       |                |
| groups        | blob                  | NO   |     | NULL    |                |
| comments      | int(10)               | NO   |     | 0       |                |
| counter       | int(10)               | NO   |     | 0       |                |
| trackbacks    | int(10)               | NO   |     | 0       |                |
| approved      | tinyint(1)            | NO   |     | 0       |                |
| notified      | tinyint(1)            | NO   |     | 0       |                |
| tb_acceptable | tinyint(1) unsigned   | NO   |     | 1       |                |
| published     | int(10)               | NO   |     | 0       |                |
| modified      | int(10)               | NO   |     | 0       |                |
| created       | int(10)               | NO   |     | 0       |                |
+---------------+-----------------------+------+-----+---------+----------------+
20 rows in set (0.02 sec)

mysql> 
 現在どういうインデックスが付いているか確認.つまりインデックス一覧の取得.
mysql> show index from d3b_entry \G
*************************** 1. row ***************************
       Table: d3b_entry
  Non_unique: 0
    Key_name: PRIMARY
Seq_in_index: 1
 Column_name: bid
   Collation: A
 Cardinality: 4519
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:
*************************** 2. row ***************************
       Table: d3b_entry
  Non_unique: 1
    Key_name: cid
Seq_in_index: 1
 Column_name: cid
   Collation: A
 Cardinality: 132
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:
*************************** 3. row ***************************
       Table: d3b_entry
  Non_unique: 1
    Key_name: uid
Seq_in_index: 1
 Column_name: uid
   Collation: A
 Cardinality: 1
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:
3 rows in set (0.00 sec)

mysql>
 bid,cid,uidにインデックスが付いている模様.
 SQL文に沿って,インデックスを作成.
mysql> create index IDX_ d3b_entry on d3b_entry(uid,approved,published,cid);
Query OK, 4519 rows affected (0.49 sec)
Records: 4519  Duplicates: 0  Warnings: 0

mysql>
 実行計画を取ってみる.
mysql> explain SELECT FROM_UNIXTIME(published+0, '%Y%m') as thismonth, count(*) as entries
 FROM d3b_entry 
 WHERE (uid=0 OR (approved=1 AND published+0 <= 1468641887)) 
 GROUP BY thismonth ORDER BY thismonth DESC LIMIT 12 \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: d3b_entry
         type: index
possible_keys: uid,IDX_ d3b_entry
          key: IDX_d3b_entry
      key_len: 12
          ref: NULL
         rows: 4519
        Extra: Using where; Using index; Using temporary; Using filesort
1 row in set (0.00 sec)

mysql>
 実行計画では作成したインデックスが使われている.Using filesortとあるのはクィックソート.Using indexしているけれど,Using filesortだ.Joinしてないけれど変数を条件にしているから仕方ないのか.

トラックバック


広告スペース
Google