p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #454545 }
span.s1 { font: 12.0px Helvetica }
span.Apple-tab-span { white-space: pre }

  其实sql优化就是对索引的优化,不加索引的情况下,单表查询你怎么查时间复杂度都是O(n),所以sql优化问题关键就在索引上。mysql索引有两种类型,hash和tree,但是hash的局限性太多了,而且重复数据多时hash索引的效率下降的很快,所以就说一下我对最常用的btree索引的看法。

  mysql的btree索引或者叫b+tree索引就是一颗二叉搜索树,并且在二叉搜索树叶节点间加了指针以方便排序或查询某范围的数据等情况使用。索引最大的问题就是在很多时候不能生效,网上跟索引有关的文章很多,基本上就是某某情况下索引不能生效,等等一大篇;但是作为一个程序员如果死记硬背这些个那真没有用,找个文科生比咱们背的好。所以我总结了几点索引不能生效的原因,网上说的那些个都可以归到这几类里面。

  1,sql写的不规范或者叫mysql查询引擎没有进行优化导致不能使索引生效。举个例子,如果对某个varchar类型的字段建立了索引,而我在sql中条件写的是columnvlaue = 1(注意这是一个数字),这个时候字段类型和参数类型不匹配,因此在查询时索引不会生效。其实查询引擎完全可以进行优化,或者编写sql的人完全可以将sql改的规范来避免这个问题。

   2,mysql设计的btree不能支持如此查询。举个例子,网上对于like查询有两种言论,一种是使用like查询索引不能生效,一种是使用like进行非最左前缀的查询索引不能生效;当然,后者是正确的。mysql的btree索引只支持最左前缀匹配。但是你说它能设计为全部匹配么,当然可以,比如使用kmp算法进行子字符串匹配。但是我估计mysql的设计人员实在不想再增加btree索引设计的复杂程度了,或者怕降低查询的效率(设子字符串长度为m,大字符串长度为n,匹配的时间复杂度会从O(M)变为O(n+m))。

   3,btree根本不支持此种查询。比如,反向查询。你说我的条件是哪个字段不等于xx,你把这个条件放到二叉搜索树里面去搜索,它根本就不知道你想要查的数据在哪个子树上面。因此就算使用索引,复杂度最坏的情况下也是O(n),跟不使用根本没区别,所以这种情况也不会使用索引。

   以上就是单表情况下索引不能生效的原因分析。此外还有聚合索引以及多表联查时索引的使用。聚合索引mysql的处理很简单,就是将几个字段拼到一起合为一个字段进行索引,因此索引中的第一个字段很重要,如果查询条件中没有第一个字段,聚合索引是不能生效的。至于多表联查,其实最应该解决的是涉及到的数据数量,这个等我研究透彻了再说吧。

mysql的索引问题分析的更多相关文章

  1. MySQL的索引优化分析(一)

    一.SQL分析 性能下降.SQL慢.执行时间长.等待时间长 查询语句写的差 索引失效关联查询太多join(设计缺陷) 单值索引:在user表中给name属性创建索引,create index idx_ ...

  2. 【mysql】索引优化分析

    1. 索引的概念 1.1 索引是什么 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL 高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.可以简单理解为排好序的快速查找数据 ...

  3. MySQL的索引优化分析(二)

    一.索引优化 1,单表索引优化 建表 CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO ...

  4. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  5. mySql索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  6. 【MySQL 高级】索引优化分析

    MySQL高级 索引优化分析 SQL 的效率问题 出现性能下降,SQL 执行慢,执行时间长,等待时间长等情况,可能的原因有: 查询语句写的不好 索引失效 单值索引:在 user 表中给 name 属性 ...

  7. B+Tree原理及mysql的索引分析

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  8. mysql索引利弊分析

    转载自:http://blog.csdn.net/linminqin/article/details/44342205  索引的利弊与如何判定,是否需要索引 相信读者都知道索引能够极大地提高数据检索的 ...

  9. MySQL单列索引和组合索引的选择效率与explain分析

    一.先阐述下单列索引和组合索引的概念: 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. 组合索引:即一个索包含多个列. 如果我们的查询where条件只有一个,我们完全可 ...

随机推荐

  1. 第一回:Scrapy的试水

    前言:今天算是见到Scrapy的第二天,之前只是偶尔查了查,对于这个框架的各种解释,我-----都-----看------不------懂----,没办法,见面就是刚. 目的:如题,试水 目标:< ...

  2. linux任务前后台执行

    Linux任务前后台的切换 Shell支持作用控制,有以下命令实现前后台切换: 1. command& 让进程在后台运行 2. jobs 查看后台运行的进程 3. fg %n 让后台运行的进程 ...

  3. 几种常见排序算法原理&C语言实现

    一.冒泡排序(以下各法均以从小到大排序为例,定义len为数组array的长度) 原理:比较相邻元素的大小,对于每次循环,按排序的规则把最值移向数组的一端,同时循环次数依次减少. C代码实现 写法一: ...

  4. Web测试与APP测试有哪些异同?

    1.相同点 不管是传统行业的web测试,还是新兴的手机APP测试,都离不开测试的基础知识,即是不管怎么变,测试的原理依然会融入在这两者当中. 1)设计测试用例时,依然都是依据边界值分析法.等价类划分等 ...

  5. [补档] 大假期集训Part.1

    新博客搭起来先补一发档... 那就从大假期集训第一部分说起好了QwQ 自己还是太菜掉回了2016级水平 day1: day1的时候来得有点晚(毕竟准高一)然后进机房发现早就开考了还没有给我题面于是搞了 ...

  6. DDD理论学习系列(13)-- 模块

    DDD理论学习系列--案例及目录 1. 引言 Module,即模块,是指提供特定功能的相对独立的单元.提到模块,你肯定就会想到模块化设计思想,也就是功能的分解和组合.对于简单问题,可以直接构建单一模块 ...

  7. ExtJs的expand和collapse

    最近在研究ExtJs的窗口组件(Ext.window),关于扩展显示expand和折叠显示collapse的一点心得记录一下,以便后查. var win2 = new Ext.window({ id ...

  8. github、gitlab 管理多个ssh key

    第一种方法: 通过 git 命令行来操作 1.cd ~/.ssh 2.ls 注:如果.ssh 目录下有文件存在那么表示之前添加过 3. ssh-keygen -t rsa -C "xxxxx ...

  9. JavaSE(五)JAVA对象向上转型和向下转型

    今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...

  10. Python网络数据采集1-Beautifulsoup的使用

    Python网络数据采集1-Beautifulsoup的使用 来自此书: [美]Ryan Mitchell <Python网络数据采集>,例子是照搬的,觉得跟着敲一遍还是有作用的,所以记录 ...