为了验证 MySQL 中哪些情况下会导致索引失效,面试我们可以借助 explain 执行计划来分析索引失效的突击具体场景。
explain 使用如下,什情L索只需要在查询的引失 SQL 前面添加上 explain 关键字即可,如下图所示:

而以上查询结果的面试列中,我们最主要观察 key 这一列,突击key 这一列表示实际使用的什情L索索引,如果为 NULL 则表示未使用索引,引失反之则使用了索引。面试
以上所有结果列说明如下:
id — 选择标识符,突击id 越大优先级越高,什情L索越先被执行;select_type — 表示查询的引失类型;table — 输出结果集的表;partitions — 匹配的分区;type — 表示表的连接类型;possible_keys — 表示查询时,可能使用的面试索引;key — 表示实际使用的索引;key_len — 索引字段的长度;ref— 列与索引的比较;rows — 大概估算的行数;filtered — 按表条件过滤的行百分比;Extra — 执行情况的描述和说明。其中最重要的突击就是 type 字段,type 值类型如下:
all — 扫描全表数据;index — 遍历索引;range — 索引范围查找;index_subquery — 在子查询中使用 ref;unique_subquery — 在子查询中使用 eq_ref;ref_or_null — 对 null 进行索引的高防服务器什情L索优化的 ref;fulltext — 使用全文索引;ref — 使用非唯一索引查找数据;eq_ref — 在 join 查询中使用主键或唯一索引关联;const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点。创建测试表和数据为了演示和测试那种情况下会导致索引失效,我们先创建一个测试表和相应的数据:
复制-- 创建表drop table if exists student;create table student( id int primary key auto_increment comment 主键, sn varchar(32) comment 学号, name varchar(250) comment 姓名, age int comment 年龄, sex bit comment 性别, address varchar(250) comment 家庭地址, key idx_address (address), key idx_sn_name_age (sn,name,age))ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 添加测试数据insert into student(id,sn,name,age,sex,address) values(1,cn001,张三,18,1,高老庄), (2,cn002,李四,20,0,花果山), (3,cn003,王五,50,1,水帘洞);1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.当前表中总共有 3 个索引,如下图所示:

PS:本文以下内容基于 MySQL 5.7 InnoDB 数据引擎下。
索引失效情况1:非最左匹配最左匹配原则指的是,以最左边的为起点字段查询可以使用联合索引,否则将不能使用联合索引。我们本文的联合索引的字段顺序是 sn + name + age,我们假设它们的顺序是 A + B + C,以下联合索引的使用情况如下:

从上述结果可以看出,如果是以最左边开始匹配的字段都可以使用上联合索引,比如:
A+B+CA+BA+C其中:A 等于字段 sn,B 等于字段 name,C 等于字段 age。b2b信息网其中:A 等于字段 sn,B 等于字段 name,C 等于字段 age。
而 B+C 却不能使用到联合索引,这就是最左匹配原则。
索引失效情况2:错误模糊查询模糊查询 like 的常见用法有 3 种:
模糊匹配后面任意字符:like 张%模糊匹配前面任意字符:like %张模糊匹配前后任意字符:like %张%而这 3 种模糊查询中只有第 1 种查询方式可以使用到索引,具体执行结果如下:

如果索引列使用了运算,那么索引也会失效,如下图所示:

查询列如果使用任意 MySQL 提供的函数就会导致索引失效,比如以下列使用了 ifnull 函数之后的执行计划如下:

如果索引列存在类型转换,那么也不会走索引,比如 address 为字符串类型,而查询的时候设置了 int 类型的值就会导致索引失效,如下图所示:

当在查询中使用了 is not null 也会导致索引失效,而 is null 则会正常触发索引的,如下图所示:

导致 MySQL 索引失效的常见场景有以下 6 种:
联合索引不满足最左匹配原则。模糊查询最前面的为不确定匹配字符。索引列参与了运算。索引列使用了函数。索引列存在类型转换。索引列使用 is not null 查询。站群服务器
ubuntu gedit中文乱码看起来很烦人,本文提供两种解决途径,终端命令行途径或者图形界面操作途径,其实原理都是增加编码类型,问题显示如下图,查看文档内容,发现乱码方法一:终端途径1、打开终端2、在终端中输入下面的内容,回车 复制内容到剪贴板 gconftool-2 --set --type=list --list-type=string /apps/gedit-2/preferences/encodings/auto_detected [UTF-8,CURRENT,GB18030,BIG5-HKSCS,UTF-16] 方法二:图形界面途径1、同时按住 Alt-F2,打开“Run Application”窗口2、输入gconf-editor,点击“Run“,进入Configuration Editor界面3、点击左边的”+“号找到 /apps/gedit-2/preferences/encodings,并单击4、右键auto_detected,点击“Edit Key”5、点击“Add”,在New list value处输入GB18030,点击OK6、选中列表最下面的“GB18030”,点击右边的“Up”,直到“GB18030”移动到列表的最上方7、点击OK关闭Configuration Editor8、再次查看文档内容,乱码消失注意事项:命令行的命令不要输入错误。
inux/Ubuntu系统用的时间久了,经常会有一些系统更新,除了一些系统补丁、工具补丁、工具升级之外,内核也经常对一些问题进行修改升级,这样就会产生一些新的内核,我们更新了新的内核后,就会自动帮我们添加到开机启动菜单选项中,那些旧的内核启动项,对于我们来说已经没有用了,可以删除,删除后可以让我们在开机的时候能快速的选择要启动的菜单项,同时也能清理出一些磁盘空间出来,小编下面就来分享如何删除多余的内核启动菜单项注意:小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10。。。14.04系统因为采用的默认桌面不同,所以本经验不适用,若要使用,那么请安装GNOME桌面 1、打开“应用程序”,然后在弹出菜单中点击“附件”,选择并打开“终端”,打开终端命令窗口2、在终端命令窗口中输入并执行下面的命令:uname -a,查看我们当前使用的内核,不要删除错误了,或者当我们使用的是旧内核进入系统,想删除这个内核启动项,这样也是不能删除的。只能在开机时选择别的内核启动项进入系统才能删除3、输入下面的命令,查看当前我们系统中有哪些内核启动项,同时也可以方便我们复制的操作,具体命令是:dpkg --get-selections | grep linux4、下面就开始删除内核启动项,先选择内核启动项,然后复制,这样方便操作,然后输入下面的命令:sudo apt-get remove linux-image-2.6.32.21-generic5、执行过程中会警告我们确实要执行这个操作,输入字母y,然后回车,就开始卸载旧内核了6、之后就是一些具体的卸载过程的提示,已经更新系统启动项的信息7、我们再次使用命令:dpkg --get-selections | grep linux 来查看当前的内核情况:在 linux-image-2.6.32.21-generic 后面显示deinstall,表示已经卸载了linux-headers-2.6.32.21和 linux-headers-2.6.32.21-generic是之前我们卸载的内核相关联的头文件,现在对于我们也没有用,也可以卸载了,卸载了可以帮我们清理出不少磁盘空间,具体命令是:sudo apt-get remove linux-headers-2.6.32-21sudo apt-get remove linux-headers-2.6.32-21-generic8、删除完后,再用命令:dpkg --get-selections | grep linux 查看当前内核启动选项相关信息:linux-headers-2.6.32-21 已经没有了,被删除了linux-headers-2.6.32-21-generic已经没有了,被删除了linux-image-2.6.32-21-generic 显示为deinstall,表示被卸载删除了9、 虽然在卸载旧内核的时候提示信息说已经帮我们更新了系统启动项,但为了保险起见我们执行sudo update-grub更新开机启动控制文件。