索引

索引下(5)

牧云@^-^@ 提交于 2020-03-30 11:23:02
在下列表T中,执行 select * from T where k betwee 3 and 5; ,需要执行几次树的搜索操作? mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '', index k(k)) engine=InnoDB; insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg'); SQL 语句执行流程: 在k索引树上找到k值为3的记录,取得ID为300 再到ID索引树上找到ID为300对应的R3记录 在k索引树上找到k值为5的记录,取得ID为500 再回到ID索引树上找到ID为500对应的R4记录 在k索引树上找到k值为6的记录,不符合条件,结束循环 在这个过程中,回到主键索引搜索树的过程,成为回表。 在这个例子中,由于查询结果所需要的数据只有主键索引上有,所以不得不回表。如果执行的语句是 select ID from T where k between 3 and 5; ,只需要查询ID的值,而k索引树上有这个值,不需要回表,索引k已经覆盖了查询所需要的值,成为 覆盖索引

MySQL优化(二)

╄→гoц情女王★ 提交于 2020-03-30 04:43:53
1、建立基础索引:在where,order,join字段上建立索引 优化,组合索引:基于业务逻辑 前缀索引使用上与普通索引一致! 2、索引的存储结构:Btree索引,hash索引,聚簇索引 Btree不是二叉树 在MySQL中,仅仅只有InnoDB的主键索引是聚簇结构,其他的都是典型的BTree结构 Hash索引就是key-value,就是PHP中的关联数组,索引被载入到内存时 3、queryCache,当数据表结构改动,缓存失效,动态数据不能被缓存 show variables like 'query_cache_type' show variables like 'query_cache_size' set global query_cache_size=102760448; select sql_cache * from student where user like '%fyw' 4、分区,partition 一个表的数据和索引存储在不同文件中 //利用id字段,使用hash算法,将数据分布到10个分区内 partition by hash(id) partitions 10 5、算法 (1)hash算法:(均匀分配) 分区算法,在业务逻辑层面,表示均匀分配。 (2)key算法:(均匀分配) partition by key(subject) partitions 10

《数据库优化》- MySQL优化

瘦欲@ 提交于 2020-03-29 18:31:23
前言   MySQL作为我们最常用的 关系型数据库 ,在开发中,肯定会遇到数据量比较大的情况,而没有足够的性能作为保障,往往查询会比较慢。下面,我们展开来聊聊MySQL怎么优化的。 一、MySQL性能   1、最大数据量   没有数据量和并发数的数据库性能都是没有灵魂的。   MySQL没有限制 单表最大记录数 ,它取决于操作系统对文件大小的限制。   《阿里巴巴Java开发手册》推荐:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。   性能由综合因素决定,抛开业务复杂度,影响程度依次是: 硬件配置、MySQL配置、数据表设计、索引优化 。 500万这个值仅供参考,并非铁律。   有位大佬操作过超过4亿行数据的单表,分页查询最新的20条记录耗时0.6秒。   SQL大致是: select field_1,field_2 from table where id < #{prePageMinId} order by id desc limit 20 ;   prePageMinId是上一页数据记录的最小ID。   虽然当时查询速度还凑合,随着数据不断增长,有朝一日必定不堪重负。   分库分表是个周期长而风险高的大活儿,应该尽可能在当前结构上优化,比如升级硬件、迁移历史数据等等,实在没辙了再分。对分库分表感兴趣的同学可以阅读分库分表的基本思想。      2

all index range ref eq_ref const system 索引type说明

こ雲淡風輕ζ 提交于 2020-03-28 23:19:57
背景知识 在使用sql的过程中经常需要建立索引,而每种索引是怎么处罚的又是怎么起到作用的,首先必须知道索引和索引的类型。 索引类型 type 我们可以清楚的看到 type 那一栏有 index ALL eq_ref ,他们都代表什么意思呢? 首先类型有许多,这里我只给大家介绍用的最多的 几种 类型: system>const>eq_ref>ref>range>index>ALL 越往左边,性能越高, 比如 system 就比 ALL 类型性能要高出许多 ,其中 system 、 const 只是理想类型,基本达不到; 我们自己实际能优化到 ref>range 这两个类型,就是你自己写 SQL ,如果你没优化基本上就是 ALL ,如果你优化了,那就尽量达到 ref>range 这两个级别; 左边基本达不到! 所以,要对 type 优化的前提是, 你需要有索引,如果你连索引都没有创建,那你就不用优化了,肯定是 ALL..... ; Type 级别详解 一 .system 级别 索引类型能是 system 的只有两种情况: 1. 只有一条数据的系统表 只有一条数据的系统表,就是系统里自带一张表,并且这个表就一条数据,这个基本上就达不到,这个是系统自带的表,而且就一条数据,所以基本达不到; 2. 或衍生表只能有一条数据的主查询 这个是可以实现的,但是在实际开发当中

一条SQL查询语句是如何执行的?

不想你离开。 提交于 2020-03-28 17:47:49
导读 Mysql在中小型企业中是个香饽饽,目前主流的数据库之一,几乎没有一个后端开发者不会使用的,但是作为一个老司机,仅仅会用真的不够。 今天陈某透过一个简单的查询语句来讲述在Mysql内部的执行过程。 select * from table where id=10;    撸它 首先通过一张图片来了解一下Mysql的基础架构,如下: 从上图可以看出,Mysql大致分为Server层和存储引擎层两部分。 Server层包括 连接器 、 查询缓存 、 分析器 、 优化器 等,其中包含了Mysql的大多数核心功能以及所有的内置函数(如日期,时间函数等),所有跨存储引擎的功能都在这一层实现,比如 存储过程 、 触发器 、 视图 等。 存储引擎层负责数据的存储和提取。它的架构是可插拔式的,支持 InnoDB 、 MyISAM 等多个存储引擎。Mysql中主流的存储引擎是InnoDB,由于它对事务的支持让它从Mysql5.5.5版本开始成为了默认的存储引擎。 大致了解了整体架构,现在说说每一个基础的模块都承担着怎样的责任。 1. 连接器 顾名思义,是客户端和Mysql之间连接的媒介, 负责登录、获取权限、维持连接和管理连接 。连接命令一般如下: mysql [-h] ip [- P] port -u [user] -p 在完成经典的TCP握手后,连接器会开始认证身份,要求输入密码。

谈一下如何设计Oracle 分区表

為{幸葍}努か 提交于 2020-03-28 16:23:38
在谈设计Oracle分区表之间先区分一下 分区表 和 表空间 的个概念: 表空间 :表空间是一个或多个数据文件的集合,所有数据对象都存放在指定的表空间中,但主要存放表,故称表空间。 分区表 :分区致力于解决支持极大表和索引的关键问题。它采用他们分解成较小和易于管理的称为分区的片(piece)的方法。一旦分区被定义,SQL语句就可以访问的操作某一个分区而不是整个表,因而提高管理的效率。分区对于数据仓库应用程序非常有效,因为他们常常存储和分析巨量的历史数据。当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。 表分区的具体作用 : Oracle的分区表功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。 通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理

MySQL存储引擎介绍

狂风中的少年 提交于 2020-03-28 07:43:50
一 存储引擎解释   首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点。     在讲清楚什么是存储引擎之前,我们先来个比喻,我们都知道录制一个视频文件,可以转换成不同的格式,例如mp4,avi,wmv等,而存在我们电脑的磁盘上也会存在于不同类型的文件系统中如windows里常见的ntfs、fat32,存在于linux里常见的ext3,ext4,xfs,但是,给我们或者用户看懂实际视频内容都是一样的。直观区别是,占用系统的空间大小与清晰程度可能不一样。 那么数据库表里的数据存储在数据库里及磁盘上和上述的视频格式及存储磁盘文件的系统格式特征类似,也有很多种存储方式。   但是对于用户和应用程序来说同样一张表的数据,无论用什么引擎来存储,用户能够看到的数据是一样的。不同储引擎存取,引擎功能,占用空间大小,读取性能等可能有区别。说白了,存储引擎就是在如何存储数据、提取数据、更新数据等技术方法的实现上,底层的实现方式不同,那么就会呈现出不同存储引擎有着一些自己独有的特点和功能,对应着不同的存取机制。   因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即:对表的存储、操作等的实现方法不同),表是什么,表本质上就是磁盘上的文件。   其实MySQL支持多种存储引擎

elasticsearch搜索引擎搭建

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-28 07:42:59
在该路径下,运行elasticsearch.bat该命令,后面访问127.0.0.1:9200 出现如下界面说明启动成功 elasticsearch-head操作elasticsearch的图形界面,查看它的数据 elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。elasticsearch-head 插件的安装在 Linux 和 Windows 没什么区别,安装之前确保当前系统已经安装 nodejs 即可。 启动elasticsearch-head 第一次无法访问可以在elasticsearch.yml配置一下,在下面添加如下参数 http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User" 安装kibana插件,要和elasticsearch-head版本一致 Kibana 是一个设计出来用于和 Elasticsearch 一起使用的开源的分析与可视化平台,可以用

MySQL4:索引

百般思念 提交于 2020-03-28 04:26:55
什么是索引 索引是对数据库表中一列或者多列的值进行排序的一种结构,所引用于快速找出在某个 列中有一特定值的行。不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行。表越大,查询数据所花费的时间越多,如果表中查询的列有 一个索引,MySQL能快速到达一个位置去搜索数据文件,而不必查看所有数据。 索引的含义和特点 索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。 例如,数据库里面有20000条记录,现在要执行这么一个查询:SELECT * FROM table where num = 10000。如果没有索引,必须遍历整个表,直到num等于10000的这一行被找到为止;如果在num列上创建索引,MySQL不需要任何扫描,直接在 索引中找10000,就可以得知值这一行的位置。可见,索引的建立可以提高数据库的查询速度。 索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种 存储引擎也不一定支持所有索引类型。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎有更高的额限制,MySQL中索 引的存储类型有两种:BTREE和HASH,具体和表的存储引擎相关

SQL学习笔记

不问归期 提交于 2020-03-28 04:18:08
创建视图和索引 ※视图常常被称为虚表。在视图被创建以后,你可以对视图采用如下命令:select,insert, update,delete。 ※索引是与磁盘上数据的存储方式不同的另外一种组织数据的方法。 ◎使用视图 ※视图并不占用数据库或表的物理空间。 ※创建视图的语法如下: CREATE VIEW <view_name> [(col1,col2...)] AS SELECT <col_names> FROM <table_names>; ※视图可以是多级的,也就是可以用视图来创建视图。但这会加大维护工作的复杂性。 1。列的重命名 注意: 当在视图中使用SQL的计算功能时,SQL会要求你给出一个虚字段的名字,这是可以理解,因为象 COUNT(*)或AVG(PAYMENT)是不能作为列名的。 2。SQL对视图的处理过程 ※运行SELECT语句-->查找表-->未找到-->查找视图。 3。在SELECT语句中的使用约束 在视图的SELECT语句中: ※不能使用UNION操作。 ※不能使用ORDER BY子句,但在视图中,使用GROUP BY子句可以有ORDER BY子句相同的功能。 4。在视图中修改数据 在视图创建以后,就可以用Insert,Update,Delete语句来更新,插入,删除视图中的数据。 5。在视图中修改数据的几个问题 ※对于多表视图,不能使用DELETE语句。