mysql执行计划

Mysql 索引概念,分类,使用技巧,优化分析总结介绍

拜拜、爱过 提交于 2020-01-25 14:05:19
文章目录 概念 有什么用? 分类 物理存储顺序 逻辑存储 数据类型 b+ tree 索引列 存储引擎支持 Innodb Myisam 使用技巧 建索引 用索引 优化分析 常见面试题 参考文章 概念 mysql index官方文档 索引是数据库管理系统中一种数据结构,用以协助快速查询数据库表中数据,典型的索引结构如B+ tree。 有什么用? MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。 拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。 分类 物理存储顺序 MySQL的 Innodb 存储引擎的索引分为聚集索引和非聚集索引(二级索引)。 聚集索引是Innodb引擎才有的概念。 为什么说是按照物理存储顺序分类呢?因为聚集索引的逻辑顺序就是数据记录的物理顺序,而非聚集索引却不是如此。 举个例子,聚集索引就像是汉语字典中的拼音索引,字典中的字就是按照这个顺序存的。非聚集索引就像是部首索引,相同偏旁的字在索引页上是相邻的,但是真实的位置却不一定是相邻的。类似的例子还有电话簿,大家自行想象一下。 聚集索引怎么选定呢? 第一个唯一且不能为NULL的列就会被选为聚集索引

python Mysql 基本操作

痞子三分冷 提交于 2020-01-25 10:00:08
1、mysql常用增删查改 连接: mysql -uroot -pgloryroad mysql -uroot -p password: mysql -h39.1.1.1 -uroot -pgloryroad 默认端口:3306 mysql -h39.1.1.1 -uroot -pgloryroad -P3306 #端口号 show databases; create database test51; #查看当前使用的数据库 use jin; select database(); #使用哪个数据库 use test; #创建数据库gloryroad CREATE DATABASE IF NOT EXISTS gloryroad DEFAULT CHARSET utf8 COLLATE utf8_general_ci; #查看存在的表 show tables; #创建表 create table student( id int(11) not null auto_increment, name varchar(20) not null, age int(3), admissiondate datetime default NOW(), primary key(id) )engine=innodb default charset=utf8; #查看建表语句 show create

【MySQL】项目中常用的 18 条 MySQL 优化 打造高性能 SQL 语句

微笑、不失礼 提交于 2020-01-25 06:21:28
1. 执行计划EXPLAIN 要想做MySQL优化,首先必须知道如何善用执行计划EXPLAIN。下图做个简单的示例并标注需要重点关注的数据。 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式 key_len列,索引长度 rows列,扫描行数。该值是个预估值 Extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary 关于EXPLAIN的详细分析,可以阅读另一篇文章: 【MySQL】执行计划EXPLAIN详解 2. SELECT语句务必指明字段名称 SELECT *增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。 3. 如果排序字段没有用到索引,就尽量少排序 4. 当只需要一条数据的时候,使用LIMIT 1 这是为了使EXPLAIN中type列达到const类型 5. SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name

MySQL数据优化总结-查询备忘录

你离开我真会死。 提交于 2020-01-24 15:29:35
一、优化分类 二、测试数据样例 参考mysql官方的sakina数据库。 三、使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志。第二个,慢查询日志存储位置。第三个,没有使用索引的也会记录到慢查询日志中。第四个,超过1秒之后的查询记录到慢查询日志中(通常设置100ms)。 3.1、分析慢查询日志文件 3.1.1 tail命令 tail -50 /home/mysql/sql_log/mysql_slow.log,输入文件中的尾部内容,即末尾50行数据. 我们抽出其中一条,查看,如下图所示。 query_time,查询耗时(单位秒);lock_time,锁表时间。rows_sent,发送请求的行数;rows_examined,查询数据导致扫描表用到的行数。 3.1.2 官方mysqldumpslow工具 mysqldumpslow ,默认随mysql安装。 mysqldumpslow -h,可查询工具支持的命令。 mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log | more ,返回结果如下图所示。 3.1.3 pt-query-digest工具 比mysqldumpslow反馈的信息多。 pg-query-digest --help 查看帮助,查看使用命令。 pg-query-digest

MySQL开发规范

只愿长相守 提交于 2020-01-24 15:25:01
MySQL开发规范 基于阿里数据库设计规范扩展而来 : https://yq.aliyun.com/articles/709387 参考,58到家MySQL军规升级版 : https://www.jianshu.com/p/c077581693fb 基础规范 表存储引擎必须使用InnoDB MySQL常见的三种存储引擎(storage_engine) : InnoDB、MyISAM、MEMORY 存储引擎就是指 表的类型以及表在计算机上的存储方式 通过“SHOW ENGINES”语句来查看 MySQL中的存储引擎 特性 innoDB MyISAM Memory 事务安全 支持 无 无 存储限制 64T 有 有 空间使用 高 低 低 内存使用 高 低 高 插入数据的速度 低 高 高 读取数据的速度 低 高 高 对外键的支持 支持 无 无 全文索引 不支持 支持 InnoDB存储引擎 InnoDB给MySQL的表提供了 事务处理 、 回滚 、 崩溃修复能力 和 多版本并发控制 的事务安全 InnoDB存储引擎总支持 AUTO_INCREMENT 。自动增长列的值不能为空,并且值必须唯一。MySQL中规定自增列必须为主键 InnoDB还支持 外键(FOREIGN KEY) 。外键所在的表叫做子表,外键所依赖(REFERENCES)的表叫做父表,父表中被子表外键关联的字段必须为主键。

【MySQL】执行计划EXPLAIN详解

二次信任 提交于 2020-01-24 13:18:54
首先来看下EXPLAIN执行计划包含的信息: 其中最重要的字段有 type、key、key_len、rows、Extra 。 本篇接下来将对字段进行详细的分析。 分析之前先创建表格测试: -- ---------------------------- -- Table structure for cps_commodity_info -- ---------------------------- CREATE TABLE ` cps_commodity_info ` ( ` id ` bigint ( 20 ) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键' , ` sku_id ` varchar ( 20 ) COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '商品skuId' , ` sku_name ` varchar ( 100 ) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '商品名称' , ` price ` decimal ( 10 , 2 ) NOT NULL DEFAULT '0.00' COMMENT '商品价格' , ` is_on_top ` tinyint ( 4 ) NOT NULL DEFAULT '0'

MySql安装与使用(linux)

此生再无相见时 提交于 2020-01-24 04:48:03
安装 MySQL 注意:此处安装是yum安装为例: MySQL安装 #yum install mysql-server 完后显示如下: MySQL初始化 #service mysqld start 查看端口号(默认端口号:3306) ‘#mysql_secure_installation’ Enter current password for root (enter for none ):请输入当前root用户的密码,如果没有按回车,注意此root并非linux的root用户。 Set root password ?是否设置root密码? 需要设置的密码:Vqdqi0oTVejf Remove anonymous users? [Y/n] 是否移除匿名用户,选择移除(Y) Disallow root login remotely? [Y/n] 是否允许root远程登录(默认不允许) Remove test database and access to it? [Y/n] 是否移除测试数据库(建议先不移除) Reload privilege tables now? [Y/n] 是否重新加载权限表(当我们更改了mysql用户相关的信息之后建议去重载权限) MySQL的启动控制 语法:service mysqld start/stop/restart 进入mysql的方式: mysql

MySQL 优化 —— IS NULL 优化

北城以北 提交于 2020-01-23 18:10:42
引言 本博客翻译自 MySQL 官网: IS NULL Optimization , MySQL版本 5.7。 MySQL 对 IS NULL 的优化 MySQL 可以对 IS NULL 执行和常量等值判断(列名 = 常量表达式,如name = 'Tom')相同的优化。MySQL 可以利用索引和范围来搜索空值。 例如: SELECT * FROM tbl_name WHERE key_col IS NULL; SELECT * FROM tbl_name WHERE key_col <=> NULL; SELECT * FROM tbl_name WHERE key_col=const1 OR key_col=const2 OR key_col IS NULL; 如果 WHERE 子句包含一个 IS NULL 条件,而这个列却被声明为 NOT NULL,那么IS NULL表达式就会被优化掉。当列值未声明为非空,那么就不会发生这种优化(例如, LEFT JOIN 右侧的表)。 MySQL 也会 优化这样的条件组合 : col_name = expr OR col_name IS NULL ,这是在已解析的子查询中较常见的形式。如果发生了这种优化,那么 EXPLAIN 执行计划会出现 ref_or_null 。 This optimization can handle one IS

python后端面试第三部分:数据储存与缓存相关--长期维护

感情迁移 提交于 2020-01-22 15:34:57
################## 数据储存与缓存相关 ####################### mysql数据库, redis数据库, 9. MySQL的索引一般是怎么实现的? B-Tree(一般是B+Tree)和Hash,然后再简单介绍一下。 存储 存储可能包含rdbms,nosql以及缓存等,我以MySQL,redis举例。 mysql相关 mysql 是流行的RDBMS 关系型数据库 1.谈谈mysql字符集和排序规则? 2.var char与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符 char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10, 除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。 尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。 再者,char的存储方式是,对英文字符

Mysql 数据类型优化之:选择更小的数据类型

一个人想着一个人 提交于 2020-01-22 07:49:48
1. 版本 1)操作系统版本 cat /proc/version Linux version 3.10.0-957.5.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 2)数据库版本 mysql --version mysql Ver 14.14 Distrib 5.7.22, for linux-glibc2.12 (x86_64) using EditLine wrapper 2. 问题描述 2.1 问题发现 这是一个朋友跟我咨询的问题,帮他分析解决这个问题中,我发先这个问题也正好有效的印证了我们常说的mysql 数据类型优化原则,既选择更小的数据类型(在满足业务使用的情况下)。在此拿出来跟大家分享一下。他的问题如下 他在两张表上进行关联查询,如果两张表都是utf8 字符集那么查询会很快。如果两张表是utf8mb4字符集那么查询就比较慢。其实如果朋友是dba 的话,他一看执行计划就能看出来,是因为两种情况下执行计划不一样所以导致执行效率不同 下面建两张测试表,来重现朋友当时的现象 1. 创建两张字符集为 utf8 的表 create table test_join_1(id int,name varchar