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条件只有一个,我们完全可 ...
随机推荐
- HDOJ2005-第几天?
Problem Description 给定一个日期,输出这个日期是该年的第几天. Input 输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input , ...
- Python网络数据采集7-单元测试与Selenium自动化测试
Python网络数据采集7-单元测试与Selenium自动化测试 单元测试 Python中使用内置库unittest可完成单元测试.只要继承unittest.TestCase类,就可以实现下面的功能. ...
- Java基础之类和对象、单例模式、继承
Java类和对象 一般的类只能是public或者default的,若是public的,类名必须和文件名一样.一般在一个文件只写一个类,故这个类一般是加上public. 内部类还可以是private和p ...
- JS获取字符串长度(区分中英文)
JS获取字符串长度(区分中英文) 中文算2个字,英文一个. function getStrLength(str) { var cArr = str.match(/[^\x00-\xff]/i ...
- null == undefined ?
最近在看<JavaScript高级程序设计>一书,书中讲到相等操作符(==)时说,要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,但要记住 null == u ...
- Java常用文件操作-1
在我们的实际工作中经常会用到的文件操作,再此,将工作中碰到的做一个记录,以便日后查看. 1.复制文件夹到新文件夹下 /** * 复制文件夹下所有文件到指定路径 *@param oldPath *@pa ...
- 模拟生产搭建Standby RAC实验环境(11.2.0.4 DG)
模拟生产搭建Standby RAC实验环境(11.2.0.4 DG) 环境:RHEL 6.5 + Oracle 11.2.0.4 GI.DB 1.需求背景介绍 2.准备工作 3.主库配置 4.备库配置 ...
- Mongodb启动&关闭
mac 下mongo的启动和关闭以及启动问题解决 mongo的安装在这:http://www.cnblogs.com/leinov/p/6855784.html Mac os mongodb数据安装路 ...
- 再起航,我的学习笔记之JavaScript设计模式08(建造者模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- Git版本控制之多人协作
上篇文章我们主要简单的介绍了有关git的一些基本常识和一些简单的命令.但那终究是皮毛,我们使用git最主要的目的还是管理我们的项目,多人协作.本篇文章主要涉及以下两个大模块: 分支的概念及原 ...