BTree

深入了解Mysql索引

时间秒杀一切 提交于 2021-02-17 21:49:29
前言 欢迎关注我的微信公众号【 Mflyyou 】获取持续更新。 github.com/zhangpanqin/MFlyYou 收集技术文章及我的系列文章,欢迎 Star。 数据库中的索引是为了提高查询效率的,将像字典的目录一样。 当我们了解索引的原理之后,就没有必要去死记硬背所谓的 Mysql 军规之类的东西了。 本文内容 索引的类型:UNIQUE,FULLTEXT,SPATIAL,NORMAL(普通索引) 索引为什么会采用 B+ 树结构,为什么不是二叉树、B- 树 Mysql 中 B+ 树索引 和 Hash 索引应该选哪个 为什么索引的使用需要遵循 最左匹配原则 联合索引 、 聚簇索引 和 覆盖索引 分别是什么 索引添加的判断依据是什么 索引 Mysql 中常见的索引类型有: 普通索引 唯一索引 全文索引 空间索引 Mysql 中索引的数据结构有: B+Tree ,存储引擎 InnoDB 和 MyISAM 都支持。因为我们一般都是使用存储引擎 InnoDB 和 MyISAM ,我们都是使用 B+Tree 数据结构的索引。 HASH ,存储引擎 MEMORY 支持,存储引擎 InnoDB 和 MyISAM 不能手动定义 HASH 索引。 因此,我们详细了解 B+Tree 就行了。 我们先来介绍一下两种索引的数据结构的区别,感受一些各自的使用场景。 Hash 数据结构的索引

MySQL派生表(derived)优化一例

六月ゝ 毕业季﹏ 提交于 2021-02-15 02:47:00
1、什么是派生表derived 关键字:子查询–>在From后where前的子查询 mysql > explain select * from ( select * from t) a where id = 2 ; + -- --+-------------+------------+------+---------------+-------------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + -- --+-------------+------------+------+---------------+-------------+---------+-------+------+-------+ | 1 | PRIMARY | < derived2 > | ref | < auto_key0 > | < auto_key0 > | 4 | const | 0 | NULL | | 2 | DERIVED | t | ALL | NULL | NULL | NULL | NULL | 4 | NULL | + -- --+-------------+------------

postgres 索引

心不动则不痛 提交于 2021-02-13 11:54:28
索引 是一种特殊的查询表,可以使用搜索引擎的数据库以加快数据检索。简单地说,索引是表中的数据的一个指针,在一个数据库中的索引是非常相似,如:一本书的目录。 例如,如果想在一本书中引用的所有页面讨论某个话题,先参考索引按字母顺序列出所有目录主题,然后转到一个或多个特定的页码。 www.yiibai.com 索引有助于加快SELECT查询和WHERE子句,但它会减慢数据的输入,UPDATE和INSERT语句。索引可以创建或删除的数据没有影响。 www.yiibai.com 创建索引涉及CREATE INDEX语句,它允许命名的索引,索引指定表的一列或多列,并指示索引是否在升序或降序排列。 索引也可以是唯一的,类似UNIQUE约束,在列上有一个索引的列或组合索引防止重复项。 CREATE INDEX命令: CREATE INDEX index_name ON table_name ; 索引类型 PostgreSQL提供了几种索引类型:B-树,哈希,GIST,SP-GiST和GIN。每个索引类型使用不同的算法,是最适合于不同类型的查询。默认情况下,CREATE INDEX命令创建B-tree索引,适合最常见的情况。 1. B-Tree: CREATE TABLE test1 ( id integer, content varchar ); CREATE INDEX test1_id

NoSQL概述-从Mongo和Cassandra谈谈NoSQL

强颜欢笑 提交于 2021-01-27 07:21:33
分两部分介绍NoSQL - NoSQL 概览 1. RDBMS VS NoSQL 2. NoSQL 种类 3. NoSQL 的一些名词 - 结合Mongo,Cassandra谈谈NoSQL的设计和应用 1. 部署架构 2. 分片 3. 数据存储与维护 4. 读写分析 5. 数据模型 关系型数据库 VS NoSQL VS New SQL 关系型数据库:元组关系(ER),提供了一套标准的接口,SQL NoSQL: non-relational,Not-Only SQL,致力于解决关系型数据库扩展的问题 New SQL: 结合RDBMS 与NoSQL的优势(还没有看到一个清晰的概念定义) NoSQL 种类 数据模型|相关数据库|典型应用|优势|劣势| ----|:----:|----:|----:|----:| key-value|Redis|缓存|快速查询|存储数据缺乏结构化 列族|Cassandra,Hbase|分布式的文件系统,大规模的数据存储|易于分布式扩展|功能受限 document|Mongo,CouchDB||free-schema|可扩展性查 图|Neo4J|社交网络|利用图结构相关算法|不易扩展 key-value 结构 wide-column(两级映射) document mongo应用 NoSQL 主要概念 1. 不支持事务和join 2. BASE VS ACID

mysql 视图查询速度慢

纵然是瞬间 提交于 2021-01-24 10:07:09
场景: 表 stockpooldata_flash CREATE TABLE `stockpooldata_flash` ( `id` bigint(15) NOT NULL AUTO_INCREMENT, `formula_id` int(8) DEFAULT NULL, `period_type` tinyint(3) DEFAULT NULL, `gpMarket` int(4) DEFAULT NULL, `gpcode` varchar(20) DEFAULT NULL, `ymd` int(11) DEFAULT NULL, `hms` int(11) DEFAULT NULL, `f1` decimal(18,4) DEFAULT NULL, `f2` decimal(18,4) DEFAULT NULL, `f3` decimal(18,4) DEFAULT NULL, `f4` decimal(18,4) DEFAULT NULL, `f5` decimal(18,4) DEFAULT NULL, `f6` decimal(18,4) DEFAULT NULL, `f7` decimal(18,4) DEFAULT NULL, `f8` decimal(18,4) DEFAULT NULL, `f9` decimal(18,4) DEFAULT NULL,

MySQL索引优化分析

好久不见. 提交于 2021-01-19 07:26:53
为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句。还在等啥子?卷起袖子就是干! 案例分析 我们先简单了解一下 非关系型数据库 和 关系型数据库 的区别。 MongoDB是NoSQL中的一种。NoSQL的全称是Not only SQL,非关系型数据库。它的特点是 性能高 , 扩张性强 , 模式灵活 ,在高并发场景表现得尤为突出。但目前它还只是关系型数据库的补充,它在数据的一致性,数据的安全性,查询的复杂性问题上和关系型数据库还存在一定差距。 MySQL是关系性数据库中的一种, 查询功能强 , 数据一致性高 , 数据安全性高 , 支持二级索引 。但性能方面稍逊与MongoDB,特别是百万级别以上的数据,很容易出现查询慢的现象。这时候需要分析查询慢的原因,一般情况下是程序员sql写的烂,或者是没有键索引,或者是索引失效等原因导致的。 公司ERP系统数据库主要是MongoDB(最接近关系型数据的NoSQL),其次是Redis,MySQL只占很少的部分。现在又重新使用MySQL,归功于阿里巴巴的奇门系统和聚石塔系统。考虑到订单数量已经是百万级以上,对MySQL的性能分析也就显得格外重要。

MySQL高级-索引

喜欢而已 提交于 2021-01-18 11:22:03
1.索引概述 MySQL官方对索引的定义为: 索引(index)是帮助MySQL高效获取数据的数据结构(有序) 。在数据之外,数据 库系统还维护者 满足特定查找算法的数据结构 ,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数 据结构上实现高级查找算法,这种数据结构就是索引 。如下面的示意图所示 : 提炼观点: 索引是什么?索引是一种数据结构 作用是什么?高效获取数据 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是 一定物理相邻的),(而其中的col1表示序号,col2我们认为是一个主键。)为了加快Col2的查找,可以维护一个右边所示的二叉查找树, 每个节点分别包含索引键值和一 个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。 (顺序查找时间复杂度一般为O(N),而二叉树查找时间复杂度优化情况下可以达到O(logN)) 举个例子:我们要查找3这个数据,在不加索引的时候需要遍历整张表,查找7次,加索引之后只需查找3次即可。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引是数据 库中用来提高性能的最常用的工具。 2.索引优势劣势 优势 1) 类似于书籍的目录索引, 提高数据检索的效率,降低数据库的IO成本 。 2) 通过索引列对数据进行排序,

一条MySQL查询语句的执行流程

强颜欢笑 提交于 2021-01-18 06:32:41
这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的。 比如,在我们从student表中查询一个id=2的信息: select * from student where id = 2; 在解释这条语句执行流程之前,我们看看MySQL的基础架构。 MySQL的逻辑架构 Server层包括连接器、查询缓存、分析器、优化器、执行器 ,涵盖 MySQL 的大多数核心服务功能,以及所有的 内置函数 ,所有 跨存储引擎的功能 都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取 。其架构模式是插件式的,支持InnoDB、MyISAM、Memory 等多个存储引擎,MySQL默认的存储引擎是InnoDB。 1, 连接器 我们在使用数据库之前,需要连接到数据库,连接语句是 mysql -h $ip -u $username -p $password 而我们的连接器就是处理这个过程的,连接器的主要功能是 负责跟客户端建立连接、获取权限、维持和管理连接 ,连接器在使用的过程中如果该用户的权限改变,是不会马上生效的,因为用户权限是在连接的时候读取的,只能重新连接才可以更新权限 连接器与客户端通信的协议是 tcp 协议的,连接以后可以使用 show processlist; 看到执行的连接数 MySQL [abc]> show processlist; +------+

560字带你彻底搞懂:MySQL的索引优化分析

风格不统一 提交于 2021-01-16 23:53:55
正文 一、SQL分析 性能下降、SQL慢、执行时间长、等待时间长 查询语句写得差 索引失效 关联查询太多join(设计缺陷) 单值索引 :在user表中给name属性创建索引,create index idx_name on user(name); 复合索引 :在user表中给name、email属性创建索引,create index idx_name_email on user(name,email); 服务器调优 及各个参数设置(缓冲、线程数等) 二,join查询 1,SQL执行顺序 a)手写SQL b)机读 c)总结 2,JOIN查询 a)建表语句 b)满足条件的join语句 #左连接 SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2.deptId; #右连接 SELECT * FROM tbl_dept t1 RIGHT JOIN tbl_emp t2 on t1.id = t2.deptId; #内连接(交集) SELECT * FROM tbl_dept t1 INNER JOIN tbl_emp t2 on t1.id = t2.deptId; #左连接(只取A独有的) SELECT * FROM tbl_dept t1 LEFT JOIN tbl_emp t2 on t1.id = t2

MySQL在按照某个字段分组、排序加序号

心不动则不痛 提交于 2021-01-10 02:35:30
事情是这样的,最近领导给了一个新的需求,要求在一张订单表中统计每个人第一次和第二次购买的时间间隔,最后还需要按照间隔统计计数,求出中位数等数据。 由于MySQL不想Oracle那般支持行号、中位数等,所以怎么在表中统计处数据成为了关键 订单表结构,主要包含字段如下 id、订单号、购买人id、下单时间、商品信息字段、购买人信息字段等 1.为了方便后续统计,我的想法是构建了一张中间表,只存储一些关键字段,如购买人id,下单时间,订单号,以及购买的第几次,结构如下图: 字段解释:fans_id:购买人id、order_time:下单时间、tid:订单号、series:商品系列、shop:店铺、times:第几次购买、sync_time:同步时间、effective:是否有效、failure_time:失效时间 2.写了一段代码,处理历史订单,把所有数据按照表中格式添加进去,方便统计,每次新订单进来时,更新一下这个表即可。 3.统计: -- 统计购买次数最大和最小 select max (times) from 统计表 where effective = '有效' -- 统计最大购买次数间隔、最小间隔以及平均间隔(中位数的话,由于MySQL没有中位数函数,所以可以利用子查询的SQL通过程序代码计算) SELECT max ( date ) as max , min ( date ) as