sql优化

MySql索引

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-06 22:10:01
MySql索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 索引也会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件 建立索引会占用磁盘空间的索引文件 所以,索引不是越多也好,我们的目的就是把索引建得恰到好处 Mysql索引相关知识 存储引擎 MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎 同一个数据库也可以使用多种存储引擎的表 在实际开发中使用最多的两种引擎是MyISAM和InnoDB(几乎都是InnoDB) MyISAM MyISAM高速引擎,拥有较高的插入,查询速度 MyISAM存储不支持事务、行级锁和外键约束的功能 MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点 MyISAM的并发插入特性允许同时选择和插入数据 MyISAM表是独立于操作系统的 每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件:表定义文件(.frm),数据文件(.MYD),索引文件(.MYI) InnoDB InnoDB:5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引

MySQL优化:explain和show profile

六眼飞鱼酱① 提交于 2020-02-06 18:36:36
前言 要想优化SQL语句,首先得知道SQL语句有什么问题,哪里需要被优化。这样就需要一个SQL语句的监控与量度指标,本文讲述的 explain 和 show profile 就是这样两个量度SQL语句的命令。 本文主要基于 MySQL5.6 讲解其用法,因为之后的MySQL版本会去掉 show profile 功能。 SQL脚本 本篇使用的表结构以及数据如下 /*Table structure for table `dept` */ CREATE TABLE `dept` ( `deptno` int(2) NOT NULL, `dname` varchar(15) DEFAULT NULL, `loc` varchar(15) DEFAULT NULL, PRIMARY KEY (`deptno`) USING BTREE, UNIQUE KEY `index_dept_dname` (`dname`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; /*Data for the table `dept` */ insert into `dept`(`deptno`,`dname`,`loc`) values (10,'ACCOUNTING','NewYork'), (20,'RESEARCH','Dallas')

mysql如何避免回表查询

為{幸葍}努か 提交于 2020-02-06 15:18:38
《 迅猛定位低效SQL? 》留了一个尾巴: select id,name where name='shenjian' select id,name ,sex where name='shenjian' 多查询了一个属性,为何检索过程完全不同? 什么是回表查询? 什么是索引覆盖? 如何实现索引覆盖? 哪些场景,可以利用索引覆盖来优化SQL? 这些,这是今天要分享的内容。 画外音:本文试验基于MySQL5.6-InnoDB。 一、什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通索引有什么差异? InnoDB 聚集索引 的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引: (1)如果表定义了PK,则PK就是聚集索引; (2)如果表没有定义PK,则第一个not NULL unique列是聚集索引; (3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引; 画外音:所以PK查询非常快,直接定位行记录。 InnoDB 普通索引 的叶子节点存储主键值。 画外音:注意,不是存储行记录头指针,MyISAM的索引叶子节点存储记录指针。 举个栗子,不妨设有表: t(id PK, name KEY, sex, flag); 画外音

SQL索引

牧云@^-^@ 提交于 2020-02-06 12:31:02
索引 索引概念、索引模型 索引是一种数据结构,能够帮助我们快速的检索数据库中的数据 数据结构:Hash索引和B+树 优缺点 Hash索引低层是哈希表,哈希表是一种KV存储数据的结构,数据存储上没有任何顺序,区间查询无法直接通过索引,可以做等值查询,不支持最左匹配规则。如果存在大量重复键,哈希索引效率会很低,存在哈希碰撞问题 B+ Tree是一种多路平衡查询树,节点天然有序,叶子节点存储了整行数据的事主键索引,也被称为聚簇索引,叶子节点存储主键的值的是为非聚簇索引。 聚簇索引和非聚簇索引的区别 聚簇索引:叶子节点查询出来的是整行数据 非聚簇索引:叶子节点查询出来的是主键的值,得到值之后还要通过主键的值再查询一次,也可以通过覆盖索引查询一次 联合索引、最左前缀匹配 在做联合索引的时候,将识别度最高的字段放在最左边(将where字句中使用最频繁的一列放在最左边) 最左匹配规则:如(key1,key2,key3)相当创建了(key1)(key1,key2)(key1,key2,key3) 通过explain查看sql语句的执行计划 注:查询优化器,可能使查询语句没有通过索引 来源: CSDN 作者: 姜_白 链接: https://blog.csdn.net/weixin_41730409/article/details/104192068

MySQL-在线处理大表数据 & 在线修改大表的表结构

核能气质少年 提交于 2020-02-06 08:57:40
文章目录 官方文档 概述 示例 大表数据的分批处理 修改大表的表结构 方案一 : 从表修改,主从切换 方案二: pt-online-schema-change 官方文档 https://dev.mysql.com/doc/ 如果英文不好的话,可以参考 searchdoc 翻译的中文版本 http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html 概述 MySQL-获取有性能问题SQL的方法_慢查询 & 实时获取 MySQL- SQL执行计划 & 统计SQL执行每阶段的耗时 上面两篇文章我们知道了如何获取有问题的SQL,以及如何统计SQL每个阶段的耗时,这样我们去优化的时候就更加有针对性。 这里我们列举几个例子,来看下如何具体的优化SQL 示例 大表数据的分批处理 分批处理大表的数据,特别是主从复制的MySQL集群, 每处理一批最好留一点时间,给主从同步复制留一点时间。 举个例子 有个大表 1千万数据,我们要修改其中的100万, 那么最好分多个批次来更新,每次5000或者1万,根据自己服务器的性能合理的调整。 存过如下, 根据自己的业务调整。 DELIMITER $$ USE ` artisan ` $$ DROP PROCEDURE IF EXISTS

mysql——B+树索引

不打扰是莪最后的温柔 提交于 2020-02-06 08:27:50
文章目录 mysql——B+树索引 何谓索引 索引类型 聚簇索引 非聚簇索引 创建索引 创建语句 创建原则 索引覆盖 最左前缀原则 索引失效 不使用索引 参考资料 mysql——B+树索引 何谓索引 索引是一种高效的数据结构,可以帮助数据库快速搜索数据,给某个字段建立索引,就会生成一棵以该字段排序的B+树,如果你不懂B+树,可以想一想为什么排序后二分查找会这么快。索引也不可以过度使用,否则会消耗很多磁盘空间,并且DML操作的时候维护索引也会很消耗性能。 索引类型 聚簇索引 聚簇索引又叫聚集索引或主键索引 聚簇索引有以下两个特点: 特点1: 按主键值的大小进行记录和页的排序,数据页(叶子节点)之间是按照主键值从小到大排序的一个双向链表 特点2: B+树的叶子节点存储的是完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列) InnoDB存储引擎会自动的为我们主键创建聚簇索引,因此只有在搜索添加是主键才能发挥作用 非聚簇索引 别名非聚集索引,二级索引,复制索引,辅助索引。 非聚簇索引按照指定的索引列排序生成B+树,并且叶子节点只存储了索引列的值和主键值,这肯定是为了节省磁盘空间,这使得我们非聚集索引查询时候只能查到主键值,如果你需要记录中除了索引列的其他列的数据,只能通过查到的主键再走一遍聚集索引,这叫做 回表 非聚簇索引又有 唯一索引,联合索引,前缀索引 唯一索引

三 表操作

懵懂的女人 提交于 2020-02-06 07:15:10
一 存储引擎介绍   一、什么是存储引擎   二、MySQL支持的存储引擎   三、使用存储引擎 二 表介绍、创建及查询 三 数据类型   一、类型介绍   二、数值类型   三、日期类型   四、字符串类型   五、枚举类型与集合类型 四 表完整性约束   一、约束简介   二、not null与default   三、unique   四、primary key   五、auto_increment   六、foreign key 五 修改表ALTER TABLE 六 复制表与删除表 一 存储引擎介绍 一、什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎

MySQL学习笔记——〇四

妖精的绣舞 提交于 2020-02-06 01:15:42
今天我们继续对MySQL内容进行一些补充,但是今天所讲的内容已经不是平时常用的了。 先穿插一条指令贯穿了今天所讲的所有知识点: MySQL结束符 结束符delimiter其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。 但是在今天的知识点中我们经常需要用到begin...end这种结构体,那么在结构体中的sql语句后的分号就不能作为结束符了,我们需要随便设置一个结束符,在结构体结束后再换回分号。 MySQL视图(View) 如果我们在日常进行数据库维护过程中需要一个重复的虚拟表,这个虚拟表的构建过程我们要敲很多次,MySQL给我们提供了一个对齐进行优化的方法_视图(View)。 视图的创建 比方我们今天需要对一个用户表中id>10的用户进行操作,这个操作要重复好多好多次,那么我们就要写好多次这样的代码 select *from (select * from table where id>10) as t; 这个时候,为了提高效率,我们就可以创建一个视图 create view v1 as select * from table where id>10; 这个时候我们只需要调用v1就可以了。 注意:视图是一个虚拟的表,是动态的

CentOS 7 安装 MySQL

a 夏天 提交于 2020-02-06 00:44:25
环境 CentOS 7.1 (64-bit system) MySQL 5.6.24 CentOS 安装 参考: http://www.waylau.com/centos-7-installation-and-configuration/ 依赖 MySQL 依赖 libaio,所以先要安装 libaio yum search libaio # 检索相关信息 yum install libaio # 安装依赖包 成功安装,提示如下: [root@bogon /] # yum install libaio 已加载插件: fastestmirror Loading mirror speeds from cached hostfile * base : mirrors .yun-idc .com * extras : mirrors .163 .com * updates : mirrors .163 .com 软件包 libaio-0 .3 .109-12 .el7 .x86_64 已安装并且是最新版本 无须任何处理 检查 MySQL 是否已安装 yum list installed | grep mysql 如果有,就先全部卸载,命令如下: yum -y remove mysql-libs .x86_64 若有多个依赖文件则依次卸载。当结果显示为 Complete!即卸载完毕。 下载

MySQL索引及执行计划

[亡魂溺海] 提交于 2020-02-05 22:54:47
MySQL索引及执行计划 索引 合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置。MySQL索引默认B+树索引。索引虽然能够提高检索效率,但同时也会降低更新的速度,因为 insert 、update、delete 也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息。 索引类型 主键索引:唯一索引,并且并指定为 primary key ,每个表中只能有一个主键 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空 普通索引:基本的索引类型,值可以为空,没有唯一性限制 复合索引:一个索引中包含多个列 何时建立索引 主键自动创建唯一索引 频繁作为查询条件的字段适合创建索引 查询中与其他表关联的字段适合创建索引 频繁更新的字段不适合创建索引,因为在更新记录的同时会更新索引 where条件中使用不到的字段不需要创建索引 在高并发下,在单值索引和复合索引中,复合索引更合适 order by字段添加索引可以提高排序速度 不需要索引 表记录较少 经常增删改的表 数据重复且分布平均的表,如性别 执行计划 可以使用 explain 关键字模拟优化器执行sql查询语句,从而分析查询语句或者表结构的性能瓶颈。 通过查看执行计划,可以了解到表的读取顺序、数据读取操作、哪些索引可以使用、哪些索引被实际使用、表之间的引用