MySQL优化笔记

[url=http://dev.mysql.com/doc/refman/5.1/zh/optimization.html]MySQL 5.1参考手册 :: 7. 优化[/url]

[b]一、查询优化[/b]
使用EXPLAIN
[code]
EXPLAIN tbl_name
[/code]
返回Field、Type、Null、Key、Default、Extra这几列对应的表中每个字段的值
相当于DESCRIBE tbl_name或SHOW COLUMNS FROM tbl_name
[code]
EXPLAIN [EXTENDED] SELECT select_options
[/code]
借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT
EXPLAIN为用于SELECT语句中的每个表返回一行信息
EXPLAIN的每个输出行提供一个表的相关信息,并且每个行包括下面的列:

[b]id[/b]
SELECT识别符。这是SELECT的查询序列号。

[b]select_type[/b]
SELECT类型,可以为以下任何一种:
1, SIMPLE
简单SELECT(不使用UNION或子查询)
2, PRIMARY
最外面的SELECT
3, UNION
UNION中的第二个或后面的SELECT语句
4, DEPENDENT UNION
UNION中的第二个或后面的SELECT语句,取决于外面的查询
5, UNION RESULT
UNION的结果。
6, SUBQUERY
子查询中的第一个SELECT
7, DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
8, DERIVED
导出表的SELECT(FROM子句的子查询)

[b]table[/b]
输出的行所引用的表。

[b]type[/b]
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
1, system
表仅有一行(=系统表)。这是const联接类型的一个特例。
2, const
表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读

取一次!
3, eq_ref
对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并

且索引是UNIQUE或PRIMARY KEY。
4, ref
对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或

PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。如果使用的键仅仅匹配少量行,该联接类型是不错的。
5, ref_or_null
该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化。
6, index_merge
该联接类型表示使用了索引合并优化方法。
7, unique_subquery
该类型替换了下面形式的IN子查询的ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
8, index_subquery
该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
9, range
只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL

。
10, index
该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。
11, ALL
对于每个来自于先前的表的行组合,进行完整的表扫描。

[b]possible_keys[/b]
possible_keys列指出MySQL能使用哪个索引在该表中找到行。
如果该列是NULL,则没有相关的索引。
在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。
为了看清一张表有什么索引,使用SHOW INDEX FROM tbl_name。

[b]key[/b]
key列显示MySQL实际决定使用的键(索引)。
如果没有选择索引,键是NULL。
要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

[b]key_len[/b]
key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。

[b]ref[/b]
ref列显示使用哪个列或常数与key一起从表中选择行。

[b]rows[/b]
rows列显示MySQL认为它执行查询时必须检查的行数。

[b]Extra[/b]
该列包含MySQL解决查询的详细信息。下面解释了该列可以显示的不同的文本字符串:
1, Distinct
MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
2, Not exists
MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
3, range checked for each record(index map: #)
MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
4, Using filesort
MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
5, Using index
从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。当查询只使用作为单一索引一部分的列时,可以使用该策略

。
6, Using temporary
为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。
7, Using where
WHERE子句用于限制哪一个行匹配下一个表或发送到客户。
8, Using sort_union(...), Using union(...), Using intersect(...)
这些函数说明如何为index_merge联接类型合并索引扫描。
9, Using index for group-by
类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,

而不要额外搜索硬盘访问实际的表。

MySQL优化器会对JOIN、INDEX、GROUP BY、ORDER BY做一些优化

[b]二、MySQL锁[/b]
对WRITE,MySQL使用的表锁定方法原理如下
* 如果在表上没有锁,在它上面放一个写锁。
* 否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
* 如果在表上没有写锁定,把一个读锁定放在它上面。
* 否则,把锁请求放在读锁定队列中。

可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
[code]
SHOW STATUS LIKE 'Table%'
[/code]

[b]三、数据库结构优化[/b]
[b]1, 使数据尽可能小[/b]
尽可能地使用最有效(最小)的数据类型
尽可能使用较小的整数类型使表更小
如果可能,声明列为NOT NULL
对于MyISAM表,如果没有任何变长列(VARCHAR、TEXT或BLOB列),使用固定尺寸的记录格式
在MySQL/InnoDB中,InnoDB表使用更紧凑的存储格式
紧凑的InnoDB格式也改变了包含UTF-8数据的CHAR列的保存方式
每张表的主索引应该尽可能短
只创建你确实需要的索引
如果很可能一个索引在头几个字符上有唯一的前缀,仅仅索引该前缀比较好

[b]使用列索引和多列索引[/b]
索引用于快速找出在某个列中有一特定值的行。
不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。
表越大,花费的时间越多。
如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
索引用于下面的操作:
1,快速找出匹配一个WHERE子句的行。
2,删除行。如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引。
3,当执行联接时,从其它表检索行。
4,对具体有索引的列key_col找出MAX()或MIN()值。由预处理器进行优化,检查是否对索引中在key_col之前发生所有关键字元素使用了WHERE

key_part_# = constant。


[b]四、优化MySQL服务器[/b]
这个命令生成所有mysqld选项和可配置变量的列表:
[code]
mysqld --verbose --help
[/code]
如果有一个mysqld服务器正在运行,通过连接它并执行这个命令,可以看到实际上使用的变量的值:
[code]
SHOW VARIABLES;
[/code]
还可以通过下面的语句看到运行服务器的统计和状态指标:
[code]
SHOW STATUS;
[/code]
通常情况若给MySQL更多的内存性能会更好。
当调节MySQL服务器时,要配置的两个最重要的变量是key_buffer_size和table_cache:
[code]
mysqld_safe --key_buffer_size=64M --table_cache=256 \
--sort_buffer_size=4M --read_buffer_size=1M &
[/code]

不同的机器硬件上使用不同的编译器性能也会有不同的提高
《黑马程序员MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化》学习笔记总目录 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化》所有知识点的笔记进行总结分类。学习时总结的目录笔记以及。和实训,将在后续更新。第一章:MySQL概述。 阅读详情

相关推荐

详解MySQL中default的使用

NULL 和 NOT NULL 修饰符、DEFAULT 修饰符,AUTO_INCREMENT 修饰符。 NULL 和 NOT NULL 修饰符 可以在每个字段后面都加上这 NULL 或 NOT NULL 修饰符来指定该字段是否可以为空(NULL), 还是说必须填上数据 (NOT NULL)。MySQL 默认情况下指定字段为 NULL 修饰符,如果一个字段指定为NOT NULL, MySQL 则不允许向该字段插入空值(这里面说的空值都为 NULL),因为这是 “规定”。 /* 创建好友表,其中id ,name ,pass都不能为空 */ create table friends ( id in

Mysql数据库基本操作(二)

-创建数据库 语法: create database databases_name; 下面我们创建一个新的数据库,名字为player,如下 mysql> create database player; 创建成功,结果显示如下: Query OK, 1 row affected (0.00 sec) 查看数据库;mysql> show databases; +----------------

FAN的专栏 1129

Zynq远程更新程序实战:从emmc到flash的完整方案解析

本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。

weixin_29163797的博客 179

MySQL之启动选项

启动选项简介 当我们使用mysql客户端可执行文件连接mysql服务器时,需要指定IP地址、用户名及密码等信息,这些信息就是mysql客户端程序启动时的选项,通过这些选项可以连接到具体的mysql服务端上。 对于mysql服务端,在启动时可以指定同时连入的客户端数量、客户端/服务单的通信方式、表的默认存储引擎、查询缓存的大小等信息, 一般这些信息具有自己的默认值,同时连入的客户端数量默认是151,表的默认存储引擎是InnoDB,程序启动时可以修改这些默认值,在启动时指定的设置项被称为启动选项(star

cainiao1412的博客 3167

Anylogic试用版密匙

#$%99dTMbLIj+hm/c9fn0suWlfQjdK9FzRH8oSbR Rbm3FEeONkF5mDLKHxhscEDBANDg4BSU2Oi6hErk TH/KzwiCtsM0jfD50uRsj60+gi9ifTlduwcpSr6a GtVSilXwF997xTVAoMLddqOzGQAbnSjBiJOBdm1Z 0QwwIEJynvYgckLfoEADzncIgNnJjYshWcmGh3s9 gTgyuQPlRBeTXfb+ZJPI1JGi4sAUljwdB53Df+AX SEf5FaIbih

qq_43939616的博客 8265

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

通过Coze平台实现将Excel文档批量导入数据库的全流程,包括B站现有参考教程全方位解读、自己实操的一些BUG解决过程,以及一些疑难问题的探索。

bailichen800的博客 8825

mysql数据库学习笔记 (汇总)

mysql数据库学习整理 登录数据库 mysql -u用户名 -p密码 查看数据库 注意以分号结尾 show databases; #显示所有数据库,(#是mysql注释的符号) _____________________________________________________________________________________ SQL概述 SQL(Structural ...

塞外听雪 1770

hcaptcha逆向实战:从API解析到参数构造的完整链路

本文详细拆解了hcaptcha验证码的逆向实战流程,从环境准备、捕获API与版本号,到解析核心加密逻辑hsw.js,再到构造getcaptcha请求参数,最后完成验证提交。文章重点剖析了motionData、n、c等关键参数的获取与构造方法,为开发者模拟浏览器行为、实现自动化验证提供了清晰的完整链路指南。

ik678901的博客 629

修改表的default值

列如: create table abc ( id int primary key, name char(10), SEX CHAR(10), city char (10) default 'beijing', ) go 1、首先找出该字段绑定约束的值 select name from sysobjects w...

weixin_34387284的博客 266

实战教程:用DETR+超分辨率搞定红外小目标检测(附完整代码)

本文提供了一套完整的红外小目标检测实战方案,通过融合EDSR超分辨率技术与改进型DETR深度学习算法,有效解决了红外图像中小目标检测的难题。文章详细介绍了从环境搭建、数据预处理、模型定制(如引入EMA注意力与S2特征层)到训练调优的全流程,并附有完整代码,旨在帮助开发者将前沿算法高效落地于安防、自动驾驶等实际场景。

weixin_29057163的博客 532

MATLAB - 使用 RRT 进行挖掘机运动规划

本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中,您将以运动树的简化形式为挖掘机建模,然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中模拟结果。

机器人控制与仿真应用 1850

MySQL优化高手笔记

表是逻辑概念,对应物理层面就是表空间先找到表空间,Extent组,extent,然后找到数据页,最后就可以加载到缓存池中了。很多数据库部署时都采用他,它是一个磁盘冗余阵列,在实际生产中,如果服务器磁盘不够用就会加磁盘,而RAID就是管理机器中的多块磁盘的一种磁盘阵列技术,它可以告诉你该向那块磁盘进行读写。将数据在另一块磁盘中做冗余备份,如果一块磁盘挂掉,则还可以使用另一块磁盘,RAID技术则可以自动进行管理。而整体上RAID既有硬件层面也有软件层面。

洺润Star的博客 996

模组 RG500Q入网问题分析

- [ ] 不同于公网,在5G专网环境中, 通常使用很多非标准的网络配置,如PLMN/APN等。因此,5G模组在专网环境下通常要做一些专门的配置才能正常入网,本文分析一例在专网环境, 5G终端无法入网问题的定位过程。 - [ ] 具体涉及到以下模组操作: 恢复出厂、SA only、锁BAND、配置MBN等

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 935

MySQL学习笔记-05(SQL优化)

MySql优化工具、MySql优化

weixin_41016739的博客 2852

AutoSAR系列讲解(入门篇)2.2-SWC的类型

该章讲解了两种SWC的分类,并且映射到实际的工程中应该是具体的什么文件类型

雪云飞星的博客 4万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

黑马Java面试笔记之MySQL篇(优化)

MySQL中,如何定义慢查询?嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题。

2201_75550069的博客 1219

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

华为大佬的“百万级”MySQL笔记,基础+优化+架构一键搞定

前言 MySQL不用多说,大家都知道它是目前最为活跃热门的开源数据库,由于成本低,操作简易的特点,所以在互联网企业中被广泛使用,即使是头部的BATJ。由此可见,想要在互联网行业混得风生水起,或者说想要进入BATJ等一线互联网公司,那么熟练掌握MySQL必定是一块必要的敲门砖。 对于MySQL的使用,可能很多刚开始工作的开发人员还是挺陌生的,但要想学习又不知道从何开始,技术的落后自然会让人感到焦虑。实际上,学习MySQL,找对方法就能轻松搞定。 今天,特将华为大佬整理的“百万级”MySQL笔记分享给你们

javassb的博客 85

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL优化学习笔记

通过配置使现有的软件和硬件获得最佳性能【最常见】寻求机会改进MySQL软件本身开发自己的存储引擎和硬件设备来扩展MySQL生态系统。

Xi Minghui's blog 482

MySQL笔记,助你性能优化和高可用架构

前言: MySQL不用多说,大家都知道它是目前最为活跃热门的开源数据库,由于成本低,操作简易的特点,所以在互联网企业中被广泛使用,即使是头部的BATJ。由此可见,想要在互联网行业混得风生水起,或者说想要进入BATJ等一线互联网公司,那么熟练掌握MySQL必定是一块必要的敲门砖。 对于MySQL的使用,可能很多刚开始工作的开发人员还是挺陌生的,但要想学习又不知道从何开始,技术的落后自然会让人感到焦虑。实际上,学习MySQL,找对方法就能轻松搞定。 今天,特将腾讯佬整理的“千万级”MySQL笔记分享给你们

uuqaz的博客 2990

MySQL笔记-从mysql基础到mysql高级、InnoDB、mysql优化等

MySQL中的索引是一种数据结构,用于快速查找表中的数据。索引类型特点用途B+树索引支持范围查询、排序查询和精确匹配查询,自平衡树结构,适用于大量数据适用于InnoDB存储引擎,支持事务处理和外键约束哈希索引基于哈希表,支持快速精确匹配查询适用于UNIQUE和PRIMARY KEY约束全文索引用于文本搜索,可以对文本数据进行索引适用于全文搜索应用空间索引用于地理空间数据,支持空间查询操作适用于地理信息系统(GIS)应用为什么InnoDB存储引擎选择使用B+tree索引结构?

m0_69255550的博客 834

华为大佬5年心血,成就百万字MySQL架构优化笔记

前言 MySQL不用多说,大家都知道它是目前最为活跃热门的开源数据库,由于成本低,操作简易的特点,所以在互联网企业中被广泛使用,即使是头部的BATJ。由此可见,想要在互联网行业混得风生水起,或者说想要进入BATJ等一线互联网公司,那么熟练掌握MySQL必定是一块必要的敲门砖。 对于MySQL的使用,可能很多刚开始工作的开发人员还是挺陌生的,但要想学习又不知道从何开始,技术的落后自然会让人感到焦虑。实际上,学习MySQL,找对方法就能轻松搞定。 今天,特将华为大佬整理的“百万级”MySQL笔记分享给你们

文章中资料均可获取,有需要请添加yunduoa2019即可 172

Mysql优化笔记

MySQL优化及索引详解

许久 368
上一篇: CLRS笔记2:算法入门
下一篇: ECUG III -- Elrang中国用户组第三次活动
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值