MySQL数据库~~~~~索引
1. 索引
索引在MySQL中也叫"键"或者"key",是存储引擎于快速找到记录的一种数据结构.
索引的数据结构: B+树
B+树性质: 索引字段要尽量小; 索引的最左匹配特性
2. 索引的种类
聚集索引(primary key)
聚集索引就是按照每张表的主键构造一颗B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚焦索引的叶子结点称为数据页.
优点:
- 它对主键的排序查找和范围查找速度非常快,叶子节点的数据就是用户所要查询的数据.
- 范围查询,即如果要查找主键某一范围内的数据,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据即可.
辅助索引(普通索引)
unique key(唯一索引) , index key(普通索引)
辅助索引的叶子节点不包含行记录的全部数据,存放的是对应的那条数据的字段的值,除了包含键值以外,每个叶子节点中的索引行中还包含一个书签,书签里存放主键的值,该书签用来告诉InnDB存储引擎去哪找到与索引相对应的行数据,如果我们要的数据就是这个键,我们直接就可以在辅助索引的叶子节点找到对应的值,这种称为覆盖索引.如果通过辅助索引的叶子节点不能直接拿到我们想要的数据,需要通过辅助索引的叶子节点中保存的主键的值再去通过聚焦索引来找到完整的一条记录,这种操作称为回表操作.
联合索引
primary key(id,name): 联合主键索引
unique key(id,name): 联合唯一索引
index(id,name): 联合普通索引
如果只查id和查id and name key使用联合索引,如果跳过第一个查后面的,无法使用联合索引.
3. 索引的操作
聚集索引
添加: 添加索引的时候要注意,给字段里面数据大小比较小的字段添加,给字段里面的数据区分度高的字段添加.
创建的时候添加:
create table t1(id int primary key);
create table t1(id int,primary key(id));
表创建完之后添加:
alter table t1 add primary key(id);
删除主键索引:
alter table t1 drop primayr key;
唯一索引
创建的时候添加:
create table t1(id int unique);
create table t1(id int,unique key uni_name(id));
表创建完之后添加:
alter table t1 add unique key u_name(id);
删除主键索引:
alter table t1 drop index u_name;
普通索引
创建的时候添加:
create table t1(id int,index index_name(id));
表创建完之后添加:
alter table t1 add index index_name(id);
create index index_name on t1(id);
删除主键索引:
alter table t1 drop index index_name;
drop index index_name on t1;
4. 索引的两大类型
- hash类型的索引: 查询速度快,范围查询慢
- btree类型的索引: b+数,层数越多,数据量指数级增长(InnoDB默认支持)
8.6.5 使用索引注意事项
范围问题,或者条件不明确,条件中出现这些符号或关键字: > ,< ,>= , <= ,!= ,between...and... ,like
使用like的时候,通配符写在最前面,也是需要全匹配一遍,然后在比较字符串的第二个字符,最左匹配的规则
尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越来越少,唯一键的区分度是1,而一些状态,性别字段可能在大数据面前区分度就0,一般需要join的字段我们要求是0.1以上,即平均1条扫描10条记录.
= 和 in 可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,MySQL的查询优化器会帮你优化成索引可以识别的形式
索引列不能参与计算,保持列"干净"
and / or
1. and 的工作原理
条件:
a = 10 and b = 'xxx' and c > 3 and d = 4
索引:
制作联合索引(d,a,b,c)
对于连续多个and,mysql会按照联合索引,从左到右的顺序找一个区分度高的索引字段,加快查询,即d>a>b>c
2. or 的工作原理
条件:
a = 10 or b = 'xxx' or c > 3 or d = 4
索引:
制作联合索引(d,a,b,c)
对于连续多个or,mysql会按照条件的顺序,从左到右依次判断,即a>b>c>d
最左前缀匹配原则
对于组合索引MySQL会一直向右匹配,直到遇到范围查询(> , < , between , like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
MySQL数据库~~~~~索引的更多相关文章
- MySQL数据库索引的4大类型以及相关的索引创建
以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...
- (转)MySql数据库索引原理(总结性)
本文引用文章如链接: http://www.codinglabs.org/html/theory-of-mysql-index.html#more-100 参考书籍:Mysql技术内幕 本文主要是阐述 ...
- 知识点:Mysql 数据库索引优化实战(4)
知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...
- 为什么MySQL数据库索引选择使用B+树?
在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...
- MySQL数据库索引之B+树
一.B+树是什么 B+ 树是一种树型数据结构,通常用于数据库和操作系统的文件系统中.B+ 树的特点是能够保持数据稳定有序,其插入与修改操作拥有较稳定的对数时间复杂度.B+ 树元素自底向上插入,这与二叉 ...
- 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询
MySQL数据库-索引.limit分页.执行计划.慢日志查询 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获 ...
- MYSQL数据库索引类型及使用
MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...
- MySQL数据库索引的底层原理(二叉树、平衡二叉树、B-Tree、B+Tree)
1.MySQL数据库索引的底层原理 https://mp.weixin.qq.com/s/zA9KvCkkte2mTWTcDv7hUg
- MySQL数据库索引常见问题
笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+ ...
- 谈谈MySQL数据库索引
在分析MySQL数据库索引之前,很多小伙伴对数据结构中的树理解不够深刻.因此我们由浅入深一步步探讨树的演进过程,再一步步引出MySQL数据库索引底层数据结构. 一.二叉树 二叉查找树也称为有序二叉查找 ...
随机推荐
- [TimLinux] MySQL 入门指导
1. 说明 本部分内容参考MySQL参考手册第三章:Chapter 3 Tutorial. 2. 版本 下载安装:https://dev.mysql.com/get/Downloads/MySQL-5 ...
- 洛谷 题解 P1615 【西游记公司】
我的程序只有1行... return scanf("%d:%d:%d\n%d:%d:%d\n%d", &a, &b, &c, &x, &y, ...
- 每个pool pg数计算
ceph PGs per Pool Calculator 原文档:http://xiaqunfeng.cc/2017/09/18/ceph-PGs-per-Pool-Calculator/ 2017- ...
- ARTS-S gitlab与jenkins实现持续集成
jenkins配制 系统管理->管理插件->可选插件->选择安装 Gitlab Hook Plugin和Build Authorization Token Root Plugin插件 ...
- stm32 io操作 头文件规范
在stm32众多项目开发中,有太多的对io进行操作,若置1或清0,使用官方库提供的函数,固然方便,规范,但是需要包含标准的库,尺寸较大,还得处理不同版本兼容问题,包括io初始化也太繁琐,于是操作原子等 ...
- 为什么要使用MQ消息中间件?这3个点让你彻底明白!
前言 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三个主要的,即以下六个字: 解 ...
- Docker swarm实战总结
一.简介 Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源 ...
- pcntl_signal(): Error assigning signal
错误原因:SIGSTOP(19)和SIGKILL(6)两个信号不能使用,进程间通信换成其他信号量就好了.
- 如何用Postman做接口测试
postman介绍&测试准备: postman介绍:postman是一个开源的接口测试工具,无论是做单个接口的测试还是整套测试脚本的拨测都非常方便. 前期准备:测试前,需要安装好postman ...
- ASP.NET Core开发者指南()
你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“作为 ASP.NET Core 开发者,我接下来应该学习什么?”,我把这张图作为建议 ...