zoukankan      html  css  js  c++  java
  • 当sex字段是int或者char类型,select * from user where sex=1这种会走索引吗?

    常见type级别

    system > const > eq_ref > ref > range > index > ALL

    越往左边,性能越高,比如system就比ALL类型性能要高出许多,其中system、const只是理想类型,基本达不到;我们自己实际能优化到ref>range这两个类型,就是你自己写SQL,如果你没优化基本上就是ALL,如果你优化了,那就尽量达到ref>range这两个级别。

    当sex字段为char类型

    首先咱们先建表

    CREATE DATABASE student;
    CREATE TABLE stu(
       `id` INT PRIMARY KEY,
       `sex` CHAR,
       KEY `idx_sex` (`sex`) USING BTREE		
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    insert into stu valuse(1,'0'),(2,'0'),(3,'1');
    

    咱们给sex字段加了B树索引

    char类型 加单引号与不加区别

    EXPLAIN SELECT * FROM stu WHERE sex=1;
    


    可以查看到,type为index,查询行数3条,即将所有记录都查询了一遍
    所以不会走索引!!!!

    EXPLAIN SELECT * FROM stu WHERE sex='1';
    


    加了单引号,走了索引,type为ref级别,查询行数1条。
    所以会走索引

    当sex字段为int类型

    首先咱们先建表

    CREATE DATABASE student;
    CREATE TABLE stu(
       `id` INT PRIMARY KEY,
       `sex` INT,
       KEY `idx_sex` (`sex`) USING BTREE		
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    insert into stu valuse(1,'0'),(2,'0'),(3,'1');
    

    int类型 加单引号与不加区别

    EXPLAIN SELECT * FROM stu WHERE sex=1;
    
    EXPLAIN SELECT * FROM stu WHERE sex='1';
    



    两条语句执行结果可知,数据类型为int类型,不管加不加单引号,都会走索引,type级别都为ref

    总结

    • 当查询的类型与字段类型不一致时,不会走索引。
    • int类型无论加没有加引号都会走索引。
    • 为了避免不走索引,最好还是使得查询的类型与字段类型一致。

    TIP

    2020年9月25日 面试项目经理告诉我,sex=1,在几百万条数据情况下,不走索引,系统会认为不走索引速度更快一些,所以选择不走索引。

  • 相关阅读:
    jsonp解决跨域
    rkhunter
    freshclam
    ntpdate
    一个汉字占几个字节
    plsql developer 使用 oracle instantclient的安装和配置
    初学者学习计划
    pslq常用操作
    plsql使用
    Tomcat性能调优方案
  • 原文地址:https://www.cnblogs.com/turbo30/p/13696659.html
Copyright © 2011-2022 走看看