zoukankan      html  css  js  c++  java
  • 隐蔽的索引失效的查询有哪些?

    隐蔽的索引失效的查询有哪些?

    答:1.表列类型与where值类型不一致;

    2.join表的字符编码不同时;

    第一类:“列类型”与“where类型”的值类型不一致,不能命中索引,会全表扫描

    如create table t1(

    celll varchar(3) primary key

    )engine = innodb default charset=utf8;

    添加数据:

    insert into t1 (cell) values ('111'),('222'),('333');

    数据分析

    1)cell列属性类型是varchar类型;

    2)cell为主键,即是聚簇索引

    测试语句:

    语句1:select cell from t1 where cell=111;

    语句2:select cell from t1 where cell='111';

    测试结论:

    第一句:where后的值类型是整数(与列属性不一样)

    mysql在执行语句的时,进行了强制了类型转换,没命中索引,进行全表扫描

    第二句:where后值类型是字符串(与列属性一样)

    类型相同,命中索引,一条记录

    第二类,相join的两张表的字符编码不同,不能命中索引

    create table t2(

    celll varchar(3) primary key

    )engine = innodb default charset=latin1;

    添加数据:

    insert into t2 (cell) values ('111'),('222'),('333'),('444'),('555'),('666');

    create table t3(

    celll varchar(3) primary key

    )engine = innodb default charset=utf8;

    添加数据:

    insert into t3 (cell) values ('111'),('222'),('333'),('444'),('555'),('666');

    数据分析

    1)t2和t1字符集不同;

    2)t3和t1字符集相同;

    3)t1,t2,t3表结构完全相同

    测试语句:

    语句1:select * from t1,t2 where t1.cell=t2.cell;

    语句2:select * from t1,t3 where  t1.cell= t3.cell;

    测试结论:

    1:连表t1和t2(字符集不同),关联属性是cell

    t1和t2字符集不同,存储空间不同。t1和t2相join时,遍历了t1表中的所有记录,t1

    的每一条记录又要遍历t2的所有记录,实际上就是进行笛卡尔积循坏计算,索引无效;

    2:连表t1和t3(字符集相同),关联属性是cell

    t1和t3相join时,遍历了t1的所有记录,t1的每一条记录使用t3索引,即扫描1行记录

    学习架构师之路

  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/XiDaPuBen/p/12821981.html
Copyright © 2011-2022 走看看