mysql 索引
索引:排好序的快速查找数据结构
优势:
会影响查询(select)(降低数据库io成本)
排序(order by)(降低cpu的消耗)
劣势:
索引也是一张表,保留了主键和索引字段,并指向实体表的记录,索引也是要占用空间的
降低更新表的速度(增删改),因为在更新表时,mysql不仅要保存数据,也要保存索引文件更新索引列的字段,调整因为更新所带来的索引信息
需要花时间研究建立最完美的索引(需要研究主要需要什么来索引)
什么情况建索引:
主键自动建立唯一索引
频繁作为查询条件的应建索引
查询中与其他表关联的字段,外键关系建立索引
单键/组合索引的选择问题(高并发倾向建组合索引)
查询中需要排序的字段需要建索引
查询中统计或分组(group by)字段
什么时候不要建索引:
表的记录太少(300百万级别)
经常增删改的表(不仅要保存表,还要保存索引文件)
数据重复且平均分布的字段 (性别只有男女之分,且在表的分布将近为一半)
单值索引(一个索引只能包含一个列)(一个表可以有多个)
select * from user where name = ""
在user表中的name上建索引(索引名为(一般使用idx作为索引前缀):idx_user_name 建索引方法:create index)
create index idx_user_name on user(name)
复合索引
select * from user where name = "" and email = ""
在user表中的name和email上建索引(索引名为(一般使用idx作为索引前缀):idx_user_nameEmail 建索引方法:create index)
create index idx_user_nameEmail on user(name,email)
唯一索引(索引列的值必须唯一,允许有空值)(银行卡号)
create unique index
删除索引(idx_user_name是索引名 user是表名)
drop index idx_user_name on user
查看索引
show index from user
为什么选用B+树作为数据库的索引结构:
B+树的中间节点不保存数据,是纯索引,但是B树的中间节点是保存数据和索引的,相对来说,B+树磁盘页能容纳更多节点元素,更“矮胖”;
B+树查询必须查找到叶子节点,B树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
对于范围查找来说,B+树只需遍历叶子节点链表即可,B树却需要重复地中序遍历,在项目中范围查找又很是常见的
增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
b树(多路搜索树索引)(红色是数据 黄色是指针)
一个M阶的b树具有如下几个特征: (如下图M=3)(下文的关键字可以理解为 有效数据,而不是单纯的索引)
定义任意非叶子结点最多只有M个儿子,且M>2;
根结点的儿子数为[2, M];
除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整; (儿子数:[2,3])
非叶子结点的关键字个数=儿子数-1;(关键字=2)
所有叶子结点位于同一层;
k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。(k=2)
有关b树的一些特性,注意与后面的b+树区分:
关键字集合分布在整颗树中;
任何一个关键字出现且只出现在一个结点中;
搜索有可能在非叶子结点结束;
其搜索性能等价于在关键字全集内做一次二分查找;
b+树,是b树的一种变体,查询性能更好。m阶的b+树的特征:
有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。
原文地址:https://www.cnblogs.com/easyjava/p/15133495.html
- PHP-数组
- hdu---1506(Largest Rectangle in a Histogram/dp最大子矩阵)
- 日志分析实战之清洗日志小实例6:获取uri点击量排序并得到最高的url
- golang使用sort接口实现排序示例
- hdu----(5056)Boring count(贪心)
- hdu----(5055)Bob and math problem(贪心)
- hadoop3.0 Yarn支持网络资源:network原理设计文档说明【中文】
- PHP-超级全局变量
- 日志分析实战之清洗日志小实例5:实现获取不能访问url
- CentOS安装Redis、PHPredis扩展
- 日志分析实战之清洗日志小实例4:统计网站相关信息
- PHP-数组排序
- hdu---(3555)Bomb(数位dp(入门))
- PHP-循环
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 守护进程
- 【tensorflow2.0】自动微分机制
- Vue3.0 beta版学习笔记
- 【tensorflow2.0】低阶api--张量操作、计算图、自动微分
- mybatis之第一个mybatis程序(一)
- 进程间通信
- django-表单之创建表单(一)
- 原来sqlite3_get_table() 是这样抓取数据的!!!
- 【tensorflow2.0】中阶api--模型、损失函数、优化器、数据管道、特征列等
- 最短路径Dijkstra算法的简单实现
- django-表单之获取表单信息(二)
- 【tensorflow2.0】高阶api--主要为tf.keras.models提供的模型的类接口
- django-表单之模型表单(三)
- sqlite3数据库封装 - 动态链接库
- 【tensorflow2.0】张量的结构操作