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条件只有一个,我们完全可 ...
随机推荐
- bazel 测试过程
google的bazel如日中天,尽管我觉得make已经很好用,但是还是尝试一下,记录之. 首先,从 https://github.com/bazelbuild/bazel/releases 下载对应 ...
- Linux shell 自定义函数
一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带functi ...
- java服务端和用户端
1.server Logintherad: package com.zdsofe.server; import java.io.InputStream; import java.io.OutputSt ...
- 关于vue组件的一个小结
用vue进行开发到目前为止也有将近一年的时间了,在项目技术选型的时候隔壁组选 react的时候我们坚持使用vue作为前端的开发框架.虽然两者思想上的差异不大,但是vue的语法在代码的可读性以及后期的维 ...
- Beautifulsoup和selenium的简单使用
Beautifulsoup和selenium的简单使用 requests库的复习 好久没用requests了,因为一会儿要写个简单的爬虫,所以还是随便写一点复习下. import requests r ...
- 深入理解Spring MVC 思想
目录 一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...
- overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)
上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...
- POJ--1088--dp--滑雪
#include<iostream> using namespace std; ; }; }; int dp(int,int); int row,col; int main() { whi ...
- 如何开发自己的搜索帝国之Elasticsearch
搜索引擎是什么? 搜索引擎是指根据一定的策略.运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统.搜索引擎包括全文索引.目录索引 ...
- akoj-1319-四方定理
四方定理 Time Limit:1000MS Memory Limit:65536K Total Submit:28 Accepted:11 Description 数论中著名的"四方定理 ...