mysql索引的选择
一:索引的常见模型
1.哈希表(key-value)存储的数据结构
缺点:hash索引在做区间查询时,速度慢。
优点:hash索引很适用于等值查询的场景,比如memcached以及其他一些nosql引擎。
2.有序数组
优点:有序数组在等值查询和范围查询的场景中,性能都非常优秀。
如果仅仅看查询效率,有序数组是最好的数据结构。
缺点:更新数据时成本太高。
总结:有序数组只适用于静态存储引擎。
3.m叉搜索树
二:InnoDB的索引模型
每一个索引在InnoDB里面,对应一颗B+树。
根据叶子节点的内容,索引分为主键索引和非主键索引。主键索引的叶子节点存储的是整行数据,在innoDB里,主键索引也被称为聚族索引(clustered index)。
非主键索引的叶子节点内容是主键的值。在innoDB里,非主键索引被称为二级索引(secondary index)。
基于主键索引和普通索引的查询,有什么区别?
如果语句是:select * from T where id = 500,主键查询方式,只需要搜索id这颗B+树;
如果语句是:select * from T where k = 5,普通索引查询方式,需要先搜索K索引树,得到id的值为500,再到id索引树搜索一次。这就是回表。
三:索引维护
如果某记录所在的数据页已经满了,根据B+树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去,这个过程为页分裂。这种情况下,性能会受到影响。
除了性能之外,页分裂还能影响数据页的利用率。原本放在一个页的数据,现在分到两个页中,整体空间利用率降低了50%。
自增主键:自增主键的数据插入模式,正符合了我们前面提到的递增插入的场景。每次插入一条新纪录,都是追加操作,不涉及挪动其他记录,更不会触发叶子节点的分裂。
除了考虑上面的性能,还可以从存储空间来看。比如表中有个唯一字段,如果我们是uuid,那么非主键的叶子节点都是主键的值,每个二级索引的叶子节点占用了36个字节,
但如果用整型当作主键,只需要4个字节,如果长整型,那也只有8个字节。
总结:主键长度越小,普通索引的叶子节点就会越小,普通索引占用的空间也会越小。
mysql索引的选择的更多相关文章
- 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式
单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式 一 表结构如下: 万行 CREATE TABLE t_audit_operate_log ( Fid b ...
- MySQL索引选择及规则整理
索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...
- 表数据量影响MySQL索引选择
现象 新建了一张员工表,插入了少量数据,索引中所有的字段均在where条件出现时,正确走到了idx_nap索引,但是where出现部分自左开始的索引时,却进行全表扫描,与MySQL官方所说的最左匹配原 ...
- MySQL多索引查询选择
MySQL多索引查询选择 MySQL选择索引-引入 我们知道我们一个表里面可以有多个索引的,那么我们查询数据的时候不指定索引,MySQL就会帮我们自动选择.既然是MySQL程序帮我们自动选择的那么会不 ...
- MySQL索引选择及添加原则
索引选择性就是结果个数与总个数的比值. 用sql语句表示为: SELECT COUNT(*) FROM table_name WHERE column_name/SELECT COUNT(*) FRO ...
- 五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》
系列文章 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的 ...
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
- MySQL索引原理及慢查询优化
原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- spark报错解决
19/03/04 18:18:42 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path java.i ...
- java全角和半角转换
package test; public class HalfAndFullConverseUtil { /** * ASCII表中可见字符从!开始,偏移位值为33(Decimal) */ priva ...
- [Python数据挖掘]第5章、挖掘建模(上)
一.分类和回归 回归分析研究的范围大致如下: 1.逻辑回归 #逻辑回归 自动建模 import pandas as pd from sklearn.linear_model import Logist ...
- heartFunction c语言
#include <stdio.h> int main(int argc, char *argv[]) { float y,x,z,f; for(y = 1.5f;y > -1.5f ...
- 【FJOI 20170305】省选模拟赛
题面被改成了个猪... T1猪猪划船(boat) [题目描述] 6只可爱的猪猪们一起旅游,其中有3只大猪A,B,C,他们的孩子为3只小猪a,b,c.由于猪猪们十分凶残,如果小猪在没有父母监护的情况下, ...
- linux服务基础(一)之CentOS6编译安装httpd2.4
安装http-2.4 Http依赖于apr-1.4+,apr-util-1.4+ CentOS6上默认是apr-1.3,apr-util1.3 先编译安装apr-1.5,apr-util-1.5 开始 ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- Android Studio3.1.2运行模拟器出错Emulator:emulator:ERROR:x86 emulation currently requires hardware acceleration!
出错截图如下所示: 解决方法: 由于我是已经解决了这个问题,安装了Intel x86 Emulator Accelerator,所以显示后面显示的是 Installed,如果报错和我贴的图一样,就可以 ...
- #!/usr/bin/python3 和 #!/usr/bin/env python3的区别
脚本语言的第一行指出用什么程序去执行代码. #!/usr/bin/python3调用/usr/bin下的python3解释器.#!/usr/bin/env python3首先会到env设置里查找pyt ...
- http压测工具wrk使用
安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...