10 两表优化案例

作者: 笑Skr人啊 | 来源:发表于2017-12-15 17:11 被阅读2次

    创建表

    #class表
    DROP TABLE IF EXISTS `class`;
    CREATE TABLE `class` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `card` int(10) unsigned NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
    
    #book
    DROP TABLE IF EXISTS `book`;
    CREATE TABLE `book` (
      `book_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `card` int(10) unsigned NOT NULL,
      PRIMARY KEY (`book_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    SQL语句

    mysql> explain SELECT * from class c LEFT JOIN book b ON  c.card = b.card;
    +----+-------------+-------+------+---------------+------+---------+------+------+-------+
    | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
    +----+-------------+-------+------+---------------+------+---------+------+------+-------+
    |  1 | SIMPLE      | c     | ALL  | NULL          | NULL | NULL    | NULL |   20 |       |
    |  1 | SIMPLE      | b     | ALL  | NULL          | NULL | NULL    | NULL |    9 |       |
    +----+-------------+-------+------+---------------+------+---------+------+------+-------+
    2 rows in set (0.00 sec)
    
    
    

    在左表建立索引

    mysql> show index from class;
    +-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table | Non_unique | Key_name       | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | class |          0 | PRIMARY        |            1 | id          | A         |          20 |     NULL | NULL   |      | BTREE      |         |               |
    | class |          1 | idx_class_card |            1 | card        | A         |          20 |     NULL | NULL   |      | BTREE      |         |               |
    +-------+------------+----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    2 rows in set (0.00 sec)
    
    
    mysql> explain SELECT * from class c LEFT JOIN book b ON  c.card = b.card;
    +----+-------------+-------+-------+---------------+----------------+---------+------+------+-------------+
    | id | select_type | table | type  | possible_keys | key            | key_len | ref  | rows | Extra       |
    +----+-------------+-------+-------+---------------+----------------+---------+------+------+-------------+
    |  1 | SIMPLE      | c     | index | NULL          | idx_class_card | 4       | NULL |   20 | Using index |
    |  1 | SIMPLE      | b     | ALL   | NULL          | NULL           | NULL    | NULL |    9 |             |
    +----+-------------+-------+-------+---------------+----------------+---------+------+------+-------------+
    2 rows in set (0.00 sec)
    
    

    在右表建立索引,删掉左表索引

    mysql> show index from book;
    +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | book  |          0 | PRIMARY       |            1 | book_id     | A         |           9 |     NULL | NULL   |      | BTREE      |         |               |
    | book  |          1 | idx_book_card |            1 | card        | A         |           9 |     NULL | NULL   |      | BTREE      |         |               |
    +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    2 rows in set (0.01 sec)
    
    mysql> explain SELECT * from class c LEFT JOIN book b ON  c.card = b.card;
    +----+-------------+-------+-------+---------------+----------------+---------+-------------+------+-------------+
    | id | select_type | table | type  | possible_keys | key            | key_len | ref         | rows | Extra       |
    +----+-------------+-------+-------+---------------+----------------+---------+-------------+------+-------------+
    |  1 | SIMPLE      | c     | index | NULL          | idx_class_card | 4       | NULL        |   20 | Using index |
    |  1 | SIMPLE      | b     | ref   | idx_book_card | idx_book_card  | 4       | db01.c.card |    1 | Using index |
    +----+-------------+-------+-------+---------------+----------------+---------+-------------+------+-------------+
    2 rows in set (0.00 sec)
    
    
    在右表建立索引,type变为ref,rows优化也比较明显,这是由左连接特性决定的,left join条件用于确定如何从右表搜索行,左边一定都有,所以一定要在右表建立索引

    相关文章

      网友评论

        本文标题:10 两表优化案例

        本文链接:https://www.haomeiwen.com/subject/slmdwxtx.html