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行记录

    学习架构师之路

  • 相关阅读:
    tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
    epoll 事件之 EPOLLRDHUP
    c What is the Difference Between read() and recv() , and Between send() and write()? Stack Overflow
    HTTP KeepAlive详解 IT心雪的日志 网易博客
    北京生活 TIPS 银行服务篇
    eventfdaiotest.c
    北京生活 TIPS 谈谈日常理财
    C语言抓http gzip包并解压 失败 C/C++ ChinaUnix.net
    转:javascript 对象和原型
    转:Javascript原型链和原型的一个误区
  • 原文地址:https://www.cnblogs.com/XiDaPuBen/p/12821981.html
Copyright © 2011-2022 走看看