zoukankan      html  css  js  c++  java
  • MySql系列一:单列建索引

        本文主要目的是测试单列是否应该建立索引,并以查询时间和扫描行数作为参考依据。mysql版本5.5.20

    一:建表

    CREATE TABLE `record` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `openid` varchar(63) NOT NULL,
      `tagId` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_openid` (`openid`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    二:插入数据

    向record表中导入20万测试数据

     

    三:测试openid列二值平均分布情况

    (3.1)更新数据

    update record set openid = '1' where id>0 and id<=100000;
    
    update record set openid = '2' where id>100000 and id<=200000;

    (3.2)openid列不使用索引

    (3.2.1)查询所有列

    (3.2.2)  查询tagId列

    注:rows:显示MYSQL估算执行查询的行数,不是精确值,简单且重要,数值越大越不好

    分析:不使用索引时,大致扫描193958行,查询所有列查询时间为0.230s,查询非索引单列为0.181s。所以,尽量不要查询不需要的列

    (3.3)openid列使用建表时的索引

    分析:openid列使用索引后,大致扫描101132行,查询时间0.342s,相对于不使用索引,虽然扫描的行数变少了,但是查询时间大致增加了三分之一。因为先要在BTree树中查找,然后再回表查询,导致查询时间不减反增了。所以平时我们如果在性别列等二值列建立索引,是完全没有效果的。这大概也是为什么有些时候(如二值分布,分布不均,选择超过一半的查询条件),即使该列建了索引,但是mysql选择全表查询的原因。

    四:建索引总结

    (1)经测试,在上述20万数据情况下,如果openid列4值平均分布的情况下,使用索引(全列查询0.175s)和不使用索引(全列查询0.178s)的时间大致相当。但索引还有额外内存等消耗,如果索引对查询性能改善不大,在该列建立索引作用不大。

    (2)查询出的结果数据越多,查询时间越长。在数据分布不均,某个索引查询条件下,查出的数据比较多时需要注意。全表查询也是如此。

    (3)在区分性较高的列上建索引是比较好的选择

  • 相关阅读:
    GDB+QEMU调试内核模块(实践篇)
    排序算法的python实现
    Linux命令行相关
    操作系统与网络
    计算机组成原理
    有了自己的技术博客
    if 和 if else
    十效率换算成十六进制
    <<左移 >>右移 >>>无符号右移 &与运算 |或运算 ^异或运算 ~反码
    // &与 // |或 // ^异或 // !非 // &&短路 // ||短路
  • 原文地址:https://www.cnblogs.com/fdzfd/p/8157540.html
Copyright © 2011-2022 走看看