索引列上做操作导致索引失效

通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算、函数、类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的使用索引,且不让索引失效

查看表索引

 mysql>show index from user;

复合索引,索引顺序name、age、pos

我们看到user表中创建的是一个符合索引,索引顺序name、age、pos

案例分析

举例:两条sql语句查询出来的结果是一样的,但实际在mysql底层执行过程中效率确实完全不一致的

  • 使用explain查看执行结果
mysql>explain select * from user where name="tim";

ref解释:表里面哪些字段走了索引(如果索引是主键或者唯一索引的话,会显示 const),最后选出了数据(选择行,一行一行的数据),连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值。

结论:从执行结果看,我们明显的使用到了索引(type=ref),且检索的行为1行,用到的ref为常量const

  • 使用explain查看在所有列上计算的执行结果
mysql>explain select * from user where left(name,3)="tim";

结论:我们看到执行结果是没有使用到索引且是全表扫描(type=All),我们看到ref为NULL

建议:

1、作为一个资深的程序员,为了能和DBA配合默契,在实际生产环境中,我们写的每一条sql语句都需要我们自己explain查看执行结果,写出高效且执行效率最高的sql语句。

2、另外如果我们知道如何优化mysql且说出自己在实际生产环境中优化的案例,在面试过程中也会是加分项,这样有助于我们拿到高薪。

注意:切记不要在索引列上进行计算、函数、手动或自动的类型转换,这些都可能会是导致索引失效的元凶,可能我们在测试环境中数据量不大的情况下测试没有问题,可是数据量达到千万级别甚至更大的情况下执行效率就会显而易见,有可能因为一条特别慢的sql拖垮整个服务。

点击关注发私信或评论交流文章中有问题的地方,相互学习和答疑

mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析相关推荐

  1. mysql普通索引命中_MySQL中因字段字符集不同导致索引不能命中的解决方法

    什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有 ...

  2. mysql模糊查询索引失效_MySql学习笔记(九):索引失效

    数据准备:CREATE TABLE `t_blog` ( `id` int(11) NOT NULL auto_increment, `title` varchar(50) default NULL, ...

  3. mysql 一个字段走索引吗_mysql数据库--explain(查询表是否走索引)各个字段含义...

    1.1 id列 数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 1.2 select_type列 常见的有: ◆ simp ...

  4. mysql left join 三表查询_MySql的join(连接)查询 (三表 left join 写法)

    1.内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集 Select A.name,B.name from A inner join B on A.id=B.id和 Select A.n ...

  5. mysql 修改列名和属性_mysql增加列修改列名列属性以及删除列

    首先推荐一本初学者的书,一个小册子:<mysql必知必会>简介实用,权威:有点贵,昨天才买的. http://www.2cto.com/ebook/201112/30389.html 正文 ...

  6. mysql子查询走索引吗_MySQL中in子查询会导致无法使用索引问题(转)

    MySQL的测试环境 测试表如下 create tabletest_table2 ( idint auto_increment primary key, pay_idint, pay_timedate ...

  7. mysql临时关闭索引功能_MYSQL中常用的强制性操作(例如强制索引)

    mysql常用的hint 对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的 ...

  8. mysql count join速度慢_MySql两张百万级表关联的count效率求解? 400 报错-问答-阿里云开发者社区-阿里云...

    select count(1) from B b inner join A a on a.id = b.personid where b.code like '32%' 这样试试呢######sele ...

  9. mysql semi join详解_MySQL中的semi-join

    http://www.linuxidc.com/Linux/2015-05/117523.htm 1. 背景介绍 什么是semi-join? 所谓的semi-join是指semi-join子查询. 当 ...

最新文章

  1. mfc cedit 默认显示内容_拼多多评价不显示的几大原因,看完之后才知道是触碰了这几个环节...
  2. 客户端连接XENAPP 6.5 提示 该地址未配置xenapp服务器
  3. Mac下的Parallel Windows忘记密码怎么办?
  4. ccs加载out文件_类加载流程、类加载机制及自定义类加载器详解
  5. 在SSH里用$.ajax()函数为何失败的一系列问题
  6. 美团技术:复杂环境下落地 Service Mesh 的挑战与实践
  7. 我就是认真:Linux SWAP 深度解读(必须收藏)
  8. java 移位运算符
  9. 扬州工业机器人外壳设计排名_世界十大工业机器人制造商公布,排名第一的竟是……...
  10. MySQL中登录报错_mysql登录报错 ERROR 1045 (28000)
  11. java中输出第一个a的的位置,java小编程--在一个A字符串中找到与B字符串一样的,返回B字符串出现的第一个位置...
  12. 99_包(package)
  13. 软件测试之linux环境搭建与操作Xshell、Xftp
  14. 红米手机1 升级到android5,从小米MAX 1到红米 K20 pro的“升级”之路。
  15. 【Python】潜水小白,分享一个简单基础的tkinter的猜拳小游戏
  16. vim删除奇数行_如何用vim删除特定的偶数行?
  17. 计算机系班级未来展望,大学生班长对班级未来的展望.doc
  18. 解决zabbix启动报错
  19. 字符串分割split:将一个字符串通过指定的分隔符分割成若干子串
  20. Qt实现气泡聊天的效果

热门文章

  1. NetBeans IDE中运行当前文件快捷键
  2. 软件质量模型 测试设计方法,质量模型-可靠性测试
  3. 深信服安全软件产品配置概况
  4. 修改远程桌面端口_花生壳(内网穿透)服务做远程桌面登录
  5. tms脚本演示代码之一
  6. 写代码水平的几个发展阶段
  7. Linux平台常用命令
  8. [js高手之路]this知多少
  9. 《防患未然:实施情报先导的信息安全方法与实践》——2.8 小结
  10. Redis的几个认识误区