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条件只有一个,我们完全可 ...
随机推荐
- Accord.NET_Naive Bayes Classifier
我们这个系列主要为了了解并会使用Accord.NET中机器学习有关算法,因此主要关注的是算法针对的的问题,算法的使用.所以主要以代码为主,通过代码来学习,在脑海中形成一个轮廓.下面就言归正传,开始贝叶 ...
- Linux安装搜狗输入法教程
最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的前辈写的文章,现在将全部安装步骤以及遇到的一些问题总结如下: 基本上分三步走 1,添加fcitx的键盘输入法系统 ...
- Java 方法(变量)修饰符的使用顺序
1:访问权限标识:public private protected (default) 2:static 静态 :abstract 抽象方法/类 3:final 常量:[可选,不能和abs ...
- Java ee 与安卓环境搭建个人心得
最近加了个IT俱乐部,第一次作业就是搞定eclipse,完成Java ee 与安卓环境搭建.为此我上网看了好多教程,之前我安装了Java,可以说省了不少事,而且还了解一点安装方法.流程网上都有,但是不 ...
- Python数据可视化Matplotlib——Figure画布背景设置
之前在今日头条中更新了几期的Matplotlib教学短视频,在圈内受到了广泛好评,现应大家要求,将视频中的代码贴出来,方便大家学习. 为了使实例图像显得不单调,我们先将绘图代码贴上来,此处代码对Fig ...
- 【javascript】浅谈javaScript的深拷贝
前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...
- Code:Blocks中文输出乱码解决方法
0x01 问题描述 将CB的编码格式设置为UTF-8之后,在CMD窗口输出中文乱码. 0x02 解决办法 控制台显示的时候缺省的是使用系统默认的字符集,比如windows下用的是GBk,但是默认情况下 ...
- android 学习Layout布局的使用
android 常用布局 LinearLayout(线性布局) 线性的 垂直的 水平的RelativeLaytout(相对布局) 最灵活的TableLayout(表格布局) 使用GridView代替A ...
- AIX安装恢复oracle问题-内存不足
AIX安装恢复oracle问题-----------------------2013/10/19 oracle 安装后后,进行rman恢复数据库时,启动不了dummy实例,报内存不足 RMAN&g ...
- MySQL中的数据类型及创建
MySQL创建: 1.创建数据库create database test2; 2.删除数据库drop database test2;3.创建表create table ceshi( ids in ...