zoukankan      html  css  js  c++  java
  • MySQL的索引单表优化案例分析

    建表

    • 建立本次优化案例中所需的数据库及数据表
    CREATE DATABASE db0206;
    USE db0206;
    
    CREATE TABLE `db0206`.`article`(  
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `author_id` INT(11) UNSIGNED NOT NULL,
      `category_id` INT(11) UNSIGNED NOT NULL,
      `views` INT(11) UNSIGNED NOT NULL,
      `comments` INT(11) UNSIGNED NOT NULL,
      `title` VARCHAR(255) NOT NULL,
      `content` TEXT NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB CHARSET=utf8;
    
    
    INSERT INTO `db0206`.`article` (`id`, `author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES (NULL, '1', '1', '1', '1', '1', '1');
    INSERT INTO `db0206`.`article` (`id`, `author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES (NULL, '2', '2', '2', '2', '2', '2');
    INSERT INTO `db0206`.`article` (`id`, `author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES (NULL, '3', '3', '3', '3', '3', '3');
    

    单表索引分析

    • 下面我们来执行这条sql:查询category_id为1,且comments大于1的情况下,views最多的article_id
    SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
    • 通过explain命令来查看sql查询优化信息
    EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
    • sql查询优化信息

    sql查询分析

    • 结论:很显然type是ALL,即最坏情况。Extra里还出现Using filesort(文件内排序),也是最坏情况,所以优化是必须的。

    开始优化

    1.1新建索引+删除索引

    • 建立索引的SQL语句
    CREATE INDEX idx_article_ccv ON article (category_id,comments,views);
    • 再次执行查询分析sql
    EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
    • 查询分析结果

    第一次优化结果

    • 结论:
      type变成了range,这是可以忍受的。但是extra里使用了Using filesort 仍然是无法接受的。
      但是我们已经建立的索引,为啥没有用呢?
      这是因为按照BTree索引的工作原理
      先排序category_id,
      如果遇到相同的category_id则再排序comments,如果遇到相同的commetns则再排序views
      当comments字段在联合索引中处于中间位置时,
      因为comments > 1 条件是一个范围值(所谓的range),
      Mysql无法利用索引再对后面的views部分进行检索,即range类型查询字段后面索引无效。

    1.2 第二次优化

    • 删除不合适的索引
    DROP INDEX idx_article_ccv ON article;
    • 重新建立索引
    CREATE INDEX idx_article_cv ON article(category_id,views);

    -重新执行查询分析

    EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
    • 查询分析结果
      优化成功

    • 结论:
      根据MySQL的查询分析报告可知,使用当前建立的索引,达到了type=ref,且extra中没有出现Using filesort,因此,我们现在使用的索引结构达到了最优的情况。

  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/haifeiWu/p/9079583.html
Copyright © 2011-2022 走看看