索引

非索引列上的统计 <第二篇>

早过忘川 提交于 2020-02-17 06:14:31
非索引列上的统计   有时候,可能在连接或过滤条件中的列上没有索引。即使对这种非索引列,如果查询优化器知道这些列的数据分布(统计),它也很可能做出最佳的选择。   除了索引上的统计,SQL Server可以在没有索引的列上建立统计。 即使不是索引列,当你开启了SQL Server自动创建统计功能,SQL Server就自动在执行WHERE、JOIN等查询列上创建统计。 数据分布的信息或者特定值出现在非索引列上的可能性,都能够帮助查询优化器确定最优的处理策略。即使查询优化器不能真正使用索引来定位这些列,这也仍然对其有利。如果SQL Server确信这些信息对创建更好的计划有利(这通常发生于这些列被用于一个断言时),则自动在非索引列上创建统计。默认情况下,在非索引列上创建统计是被开启的。它可以通过属性=》选项=》数据库自动创建统计设置来配置。可以使用ALTER DATABASE命令来编程覆盖这个设置。但是,为了更好的性能,建议保持这个特性开启。   下面来一个实战,以确定这个非索引列的统计也是有用的。首先,建两张表ta1,ta2分别都有十万行数据,但是反差很大,其中ta1的column2中只有一行为1,其余行全部为2。ta2正好相反。在这两个列上都没有索引。   大致的样子如下:      执行如下SQL语句: SELECT ta1.column2,ta2.column4 FROM

Mysql联合索引的数据结构(B+Tree)

ぃ、小莉子 提交于 2020-02-17 02:09:33
B+Tree中的data存储last_name,first_name,dob三个字段信息,类似于一个主键索引的中的一个字段,将三个字段组合在一起,比较的时候和单独的一个字段的区别在于,先比较last_name,然后比较first_name,最后再比较dob,执行这样的规则。 综上所述:这样就比较好理解Mysql索引的最左前缀原理 来源: CSDN 作者: 社交恐惧的岛主 链接: https://blog.csdn.net/a1_HelloWord/article/details/104349335

ElasticSearch 学习笔记

霸气de小男生 提交于 2020-02-16 21:23:23
ElasticSearch 学习笔记 文章目录 ElasticSearch 学习笔记 基本概念 倒排索引 timeout 超时 Query 与 filter 的区别 query 全文检索 短语检索 高亮检索 分组检索 平均值的检索 区间检索 批量查询 查询排序 查询缓存 文档替换与删除 ES路由 查询路由 分词 Mapping 映射 mapping的概念 查看mapping mapping的创建 mapping的修改 query相关度算法 elasticSearch 存储结构 elasticSearch 存储结构特点 扩容方案 垂直扩容(建议) shard重新分配(rebalance) master节点 master选举 节点对等的分布式架构 并发冲突 乐观锁控制 docment写入流程 问题 基本概念 index : 索引 一个索引中可以有多个type (建议一个index中只有一个type , 因为它的存储结构是将一个index的所有type的field整合成一个大的json , 当多个type的field 都不同时,那么一个docment的自己的field是有值的其他的docment的field都是null,这样会浪费很多存储空间,但是在elasticSearch7中将type给忽略了,也就是index下可以直接有docment

索引

纵然是瞬间 提交于 2020-02-16 21:11:03
索引其实就是为了提高数据查询的效率,就像书的目录一样 索引常见的三种模型: ①哈希表:k-v结构,适用于只有等值查询的场景,范围查询效率低 【插入速度很快:计算key值即可存储】 ②有序数组:等值查询和范围查询的性能就都非常优秀 【查询性能最好,效率都是二分法O(log(N)),但插入成本太高(插入一个记录就必须挪动后面所有记录)】 ∴ 有序数组索引只适用于静态存储引擎 ③搜索树:数据库使用的都是N叉搜索树 【由于读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中】 使用N叉而不使用二叉的原因: 虽然二叉搜索树效率最高,但是 索引不止存在内存中,还要写到磁盘上 。 树高决定访问数据块的时间 , 在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。对于一个 100 万行的表, 如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间。 一个查询想尽量少读磁盘,查询过程必须访问尽量少的数据块 所以 虽然二叉树搜索效率高,但往往查询可能很慢; 为了提升查询效率,使用N叉树, “N 叉”树中的“N”取决于数据块的大小 以 InnoDB 的一个整数字段索引为例,N 差不多是 1200。这棵树高是 4 的时候,就可以存 1200 的 3 次方个值,这已经 17 亿了。 而树根的数据块总在内存中的,一个 10 亿行的表上一个整数字段的索引

聊一聊关于MySQL的count(*)

我是研究僧i 提交于 2020-02-16 19:15:55
坚持更新Java技术栈相关总结,Java、MySQL、各种中间件等,关注公众号【阿丸笔记】获取第一时间更新。 收集技术相关电子书、面试题,有需要的小伙伴可以关注公众号【阿丸笔记】,无套路领取。 1. 背景 自从大家对于MySQL数据库的稳定性有了更高的追求后,经常有小伙伴有这样的疑问,对于count(*)这样的操作,有没有正确的姿势,或者有没有可以优化的地方? 但答案比较残酷,如果已经使用了正确的索引,那么基本上没有可以优化的地方。 一旦出现慢查询了,它就是慢查询了,要改,只能自己计数或者通过其他搜索平台来做。 今天,就一起来看看为什么会这样,并对大家日常会遇到的一些的困惑进行解答。 2. count(*)的实现方式 据说,MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高。 而我们的mysql一般都是用Innodb的引擎,Innodb是怎么实现count操作的呢? InnoDB 引擎就比较麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。 所以,当我们的表里面的记录越来越多的时候,count(*)就会越来越慢。 当然,我们这里说的都是不带where条件的,如果带上where条件的话,MyISAM也是很慢的。 3.正确的打开方式 嗯,首先还是说,mysql上不太推荐用count(*

B+Tree作为Mysql索引的优势?

蹲街弑〆低调 提交于 2020-02-16 14:35:31
B+Tree的性质: 非叶子节点只存储键值信息。(可以存放更多的索引) 所有叶子节点之间都有一个链指针。(提高区域访问效率) 数据记录都存放在叶子节点中。(查找数据更加快速) 1.非叶子节点只存储键值信息--Mysql的InnoDB存储引擎查找到一行记录最多只需要3次磁盘IO操作(10亿条数据量) InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。 2.所有的叶子结点之间都有双向指针--提高了Mysql顺序查找的能力 相比较B-Tree,只能一个一个结点的进行中序遍历,而对于哈希索引是无法支持范围查询,B+Tree可以通过结点之间的双向指针进行查找 3.数据全部存储在叶节点中可直接获取到数据,减少了IO次数,提高了效率 来源: CSDN 作者: 社交恐惧的岛主 链接: https://blog.csdn.net/a1_HelloWord/article/details/104340024

小白学 Python 数据分析(3):Pandas (二)数据结构 Series

血红的双手。 提交于 2020-02-16 13:54:55
在家为国家做贡献太无聊,不如跟我一起学点 Python 顺便问一下,你们都喜欢什么什么样的文章封面图,老用这一张感觉有点丑 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 引言 先介绍下 Pandas 的数据结构,毕竟数据结构是万物的基础。 Pandas 有两种主要的数据结构: Series 和 DataFrame ,本文就先介绍第一种 Series 。 模块导入 首先我们在代码中引入 Pandas 和 Numpy ,如下: import numpy as np import pandas as pd Series Series 可以简单的理解为一维数组,可以存储整数、浮点数、字符串、Python 对象等类型的数据。 这个概念有点像 Java 中的集合。 如果无法理解的话,那么可以看下面这个图(Excel 简单画画,灵魂画手登场): 这里的 data 可以是上面提到的那些数据类型,并不仅限于图中的整数。 如果 index 的值未指定,那么将会自动的创建数值类型的索引,从 0 开始,例如:0 , 1 , 2, 3 ... len(data) - 1 。 创建一个 Series ,这里我们可以使用 pd.Series 函数来创建,如下: s = pd.Series(np

MyISAM和InnoDB索引区别

我与影子孤独终老i 提交于 2020-02-16 12:56:42
首先你要知道; 无论是Myisam和Innodb引擎,如果在建表的时候没有显示的定义一行主键列的话,他内部都会自动创建一个隐藏的主键索引; 主键索引以外的索引假设称为次索引;首先Myisam和Innodb两个都是默认采用的btree索引,可以脑补一颗二叉树; myisam引擎的数据在物理磁盘上是按照顺序存储的,而innodb引擎的表数据是随机分布的; myisam的主键索引的叶子节点只存放数据在物理磁盘上的指针,其他次索引也是一样的; innodb的主键索引的叶子节点下面直接存放数据,其他次索引的叶子节点指向主键id; 由此可以挖掘出一个问题,就是如果Innodb有大数据列,比如 varchar(300),这种比较多的话,那么排序的时候用主键id排序会比较慢,因为 id主键下面放着所有数据列,而Myisam就不需要扫描数据列,要解决这个问题的话可以再建一个和主键id一起的联合索引; 索引覆盖与回行: 如果要查找的数据恰好是索引列,那么就不用在去物理磁盘上去找数据了,就是不用回行,称为索引覆盖; like查询覆盖索引例子 来自为知笔记(Wiz) 来源: https://www.cnblogs.com/hualou/p/12071090.html

Java学习--数组

心已入冬 提交于 2020-02-16 11:36:56
文章目录 数组 概念 定义 访问 注意 常见操作 数组 概念 容器:是将多个数据存储到一起,每个数据称为该容器的元素。 数组:是存储数据长度固定的容器,保证多个数据的数据类型要一致。 定义 1)定义一(动态初始化:指定长度) 数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度]; 2)定义二(静态初始化:指定内容) 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…} 3)定义三(省略静态初始化) 数据类型[] 数组名 = {元素1,元素2,元素3…} 访问 索引:每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素。 注意 1)索引越界 int[] arr = {1,2,3}; System.out.println(arr[3]); 创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,不能访问数组中不存在的索引,程序运 行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。 2)空指针异常 int[] arr = {1,2,3}; arr = null; System.out.println(arr[0]); arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了

数据库性能优化

我是研究僧i 提交于 2020-02-16 07:26:30
数据库设计   实现sql server数据库的优化,首先要有一个好的数据库设计方案。在实际工作中,许多sql server方案往往是由于数据库设计得不好导致性能很差。实现良好的数据库设计必须考虑这些问题:   1. 逻辑数据库规范化问题    一般来说,逻辑数据库设计会满足规范化的前3级标准:    第1规范:没有重复的组或多值的列;    第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分;    第3规范: 一个非关键字段不能依赖于另一个非关键字段。    遵守这些规则的数据库设计会产生较少的列和更多的表,因而也就减少了数据冗余,也减少了用于存储数据的页。   2. 生成物理数据库    要想正确选择基本物理实现策略,必须了解和利用好数据库访问格式和硬件资源的操作特点,特别是内存和磁盘子系统i/o。以下是一些常用技巧:    与每个表列相关的数据类型应该反映数据所需的最小存储空间,特别是对于被索引的列更是如此。比如能使用smallint类型就不要用integer类型,这样索引字段可以被更快地读取,而且可以在一个数据页上放置更多的数据行,因而也就减少了i/o操作。    把一个表放在某个物理设备上,再通过sql server的段把它的不分簇索引放在一个不同的物理设备上,这样能提高性能