mysql的索引问题分析
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的索引问题分析的更多相关文章
- MySQL的索引优化分析(一)
一.SQL分析 性能下降.SQL慢.执行时间长.等待时间长 查询语句写的差 索引失效关联查询太多join(设计缺陷) 单值索引:在user表中给name属性创建索引,create index idx_ ...
- 【mysql】索引优化分析
1. 索引的概念 1.1 索引是什么 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL 高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.可以简单理解为排好序的快速查找数据 ...
- MySQL的索引优化分析(二)
一.索引优化 1,单表索引优化 建表 CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO ...
- Mysql 索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- mySql索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 【MySQL 高级】索引优化分析
MySQL高级 索引优化分析 SQL 的效率问题 出现性能下降,SQL 执行慢,执行时间长,等待时间长等情况,可能的原因有: 查询语句写的不好 索引失效 单值索引:在 user 表中给 name 属性 ...
- B+Tree原理及mysql的索引分析
一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...
- mysql索引利弊分析
转载自:http://blog.csdn.net/linminqin/article/details/44342205 索引的利弊与如何判定,是否需要索引 相信读者都知道索引能够极大地提高数据检索的 ...
- MySQL单列索引和组合索引的选择效率与explain分析
一.先阐述下单列索引和组合索引的概念: 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. 组合索引:即一个索包含多个列. 如果我们的查询where条件只有一个,我们完全可 ...
随机推荐
- 封装自己的Ajax框架
Ajax技术就是利用javascript和xml实现异步交互的功能. 首先先来介绍一下Ajax相关知识点 一.Ajax对象的创建 1.创建Ajax对象的方式 a.第一种方式是针对IE浏览器 b.第二种 ...
- Android中的Activity
Android四大组件 活动(Activity) 广播接收者(BroadCastReceiver) 服务(Service) 内容提供者(Contentprovider) Activity 先来看And ...
- CentOS下安装Nginx服务器
一.nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos7作为安装环境. 1.1 gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果 ...
- 在Navicat 中给Mysql中的某字段添加前缀00
第一次分享心得,希望大家多多关注. 我遇到的情况是这样的,在Navicat中某表的varchar字段内容长度不够5的在内容前面添加‘0’:如字段内容是 101 我就要改成00101: 其中有2个难点: ...
- poj 3253 Fence Repair 优先队列
poj 3253 Fence Repair 优先队列 Description Farmer John wants to repair a small length of the fence aroun ...
- 用 Node.js 把玩一番 Alfred Workflow
插件地址(集成Github.掘金.知乎.淘宝等搜索) 作为 Mac 上常年位居神器榜第一位的软件来说,Alfred 给我们带来的便利是不言而喻的,其中 workflow(工作流) 功不可没,在它上面可 ...
- mybatis 详解(五)------动态SQL
前面几篇博客我们通过实例讲解了用mybatis对一张表进行的CRUD操作,但是我们发现写的 SQL 语句都比较简单,如果有比较复杂的业务,我们需要写复杂的 SQL 语句,往往需要拼接,而拼接 SQL ...
- javascript 用Activex方法调用数据库中的数据,只可用于IE
// JavaScript source code //创建数据库连接对象 var conn = new ActiveXObject("ADODB.Connection"); // ...
- java中使用poi导出excel表格数据并且可以手动修改导出路径
在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下
- python 深浅拷贝
先定义一个列表 >>> s = [1,'alex','alvin'] >>> s2 = s.copy() 使用copy()方法拷贝,创建一个新的对象s2 >& ...