zoukankan      html  css  js  c++  java
  • MySQL索引简单分析

    创建2张用户表user、user2,表结构相同,但user表使用InnoDB存储引擎,而user2表则使用 MyISAM存储引擎。

    -- Table "user" DDL
    
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) DEFAULT NULL,
      `email` varchar(100) DEFAULT NULL,
      `age` tinyint(4) DEFAULT NULL,
      `nickname` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `email` (`email`),
      KEY `name` (`name`),
      KEY `age` (`age`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- Table "user2" DDL
    
    CREATE TABLE `user2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) DEFAULT NULL,
      `email` varchar(100) DEFAULT NULL,
      `age` tinyint(4) DEFAULT NULL,
      `nickname` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `email` (`email`),
      KEY `name` (`name`),
      KEY `age` (`age`)
    ) ENGINE=MyISAM AUTO_INCREMENT=131610 DEFAULT CHARSET=utf8;

    分别插入10W条测试数据到表user & user2。

    <?php
    
    $example = array(
        '@qq.com', 
        '@sina.com.cn', 
        '@163.com',
        '@126.com',
        '@gmail.com',
        '@yahoo.com',
        '@live.com',
        '@msn.com',
        '@cisco.com',
        '@microsoft.com',
        '@ibm.com',
        '@apple.com');
    
    $con = mysql_connect("localhost", "root", "your_mysql_password");
    
    mysql_select_db("index_test", $con);
    
    //添加10W测试数据到表 user & user2
    for($i=0; $i<100000; $i++)
    {
        $temp = md5(uniqid());
    
        $name = substr($temp, 0, 16);
        $email = substr($temp, 8, 12).$example[array_rand($example, 1)];
        $age = rand(18, 99);
        $nickname = substr($temp, 16, 16);    
    
        mysql_query("INSERT INTO user(name,email,age,nickname) VALUES('$name','$email',$age,'$nickname')");
        mysql_query("INSERT INTO user2(name,email,age,nickname) VALUES('$name','$email',$age,'$nickname')");
    }
    
    mysql_close($con);
     
    echo 'success';
    
    ?>

     

    对索引的使用分析

    Explain Select * from user where id>100 \G;

    图1

    Explain Select * from user2 where id>100 \G;

    图2

    User 表中的数据和 User2 表中的数据是一样的,索引结构也是一样的,只不过它们的存储引擎不同。在图1中,查询用到了PRIMARY主键索引,而查询优化器预估的结果大概在65954行左右(实际是131513);在图2中,查询却没有使用索引,而是全表扫描了,返回的预估结果在131608行(实际是131509)。

    Explain Select * from user where id>100 and age>50 \G;

    图3

    Explain Select * from user where id>100 and age=50 \G;

    图4

    Explain Select * from user2 where id>100 and age>50 \G;

    图5

    Explain Select * from user2 where id>100 and age=50 \G;

    图6


    分享一个不错的博客,《理解MySQL--索引和优化》

  • 相关阅读:
    《SpringBoot揭秘 快速构建微服务体系》读后感(二)
    《SpringBoot揭秘 快速构建微服务体系》读后感(一)
    《Java多线程编程核心技术》读后感(十八)
    4.Go-结构体、结构体指针和方法
    3.GO-项目结构、包访问权限、闭包和值传递引用传递
    3.Flask-SQLAlchemy
    3.django Model
    2.深入类和对象
    2.shell编程-函数的高级用法
    mysql命令
  • 原文地址:https://www.cnblogs.com/bruceleeliya/p/2737827.html
Copyright © 2011-2022 走看看