- 浏览: 2682829 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
MySQL 5.1参考手册 :: 7. 优化
一、查询优化
使用EXPLAIN
返回Field、Type、Null、Key、Default、Extra这几列对应的表中每个字段的值
相当于DESCRIBE tbl_name或SHOW COLUMNS FROM tbl_name
借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT
EXPLAIN为用于SELECT语句中的每个表返回一行信息
EXPLAIN的每个输出行提供一个表的相关信息,并且每个行包括下面的列:
id
SELECT识别符。这是SELECT的查询序列号。
select_type
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子句的子查询)
table
输出的行所引用的表。
type
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
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
对于每个来自于先前的表的行组合,进行完整的表扫描。
possible_keys
possible_keys列指出MySQL能使用哪个索引在该表中找到行。
如果该列是NULL,则没有相关的索引。
在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。
为了看清一张表有什么索引,使用SHOW INDEX FROM tbl_name。
key
key列显示MySQL实际决定使用的键(索引)。
如果没有选择索引,键是NULL。
要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
ref
ref列显示使用哪个列或常数与key一起从表中选择行。
rows
rows列显示MySQL认为它执行查询时必须检查的行数。
Extra
该列包含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做一些优化
二、MySQL锁
对WRITE,MySQL使用的表锁定方法原理如下
* 如果在表上没有锁,在它上面放一个写锁。
* 否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
* 如果在表上没有写锁定,把一个读锁定放在它上面。
* 否则,把锁请求放在读锁定队列中。
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
三、数据库结构优化
1, 使数据尽可能小
尽可能地使用最有效(最小)的数据类型
尽可能使用较小的整数类型使表更小
如果可能,声明列为NOT NULL
对于MyISAM表,如果没有任何变长列(VARCHAR、TEXT或BLOB列),使用固定尺寸的记录格式
在MySQL/InnoDB中,InnoDB表使用更紧凑的存储格式
紧凑的InnoDB格式也改变了包含UTF-8数据的CHAR列的保存方式
每张表的主索引应该尽可能短
只创建你确实需要的索引
如果很可能一个索引在头几个字符上有唯一的前缀,仅仅索引该前缀比较好
使用列索引和多列索引
索引用于快速找出在某个列中有一特定值的行。
不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。
表越大,花费的时间越多。
如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
索引用于下面的操作:
1,快速找出匹配一个WHERE子句的行。
2,删除行。如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引。
3,当执行联接时,从其它表检索行。
4,对具体有索引的列key_col找出MAX()或MIN()值。由预处理器进行优化,检查是否对索引中在key_col之前发生所有关键字元素使用了WHERE
key_part_# = constant。
四、优化MySQL服务器
这个命令生成所有mysqld选项和可配置变量的列表:
如果有一个mysqld服务器正在运行,通过连接它并执行这个命令,可以看到实际上使用的变量的值:
还可以通过下面的语句看到运行服务器的统计和状态指标:
通常情况若给MySQL更多的内存性能会更好。
当调节MySQL服务器时,要配置的两个最重要的变量是key_buffer_size和table_cache:
不同的机器硬件上使用不同的编译器性能也会有不同的提高
一、查询优化
使用EXPLAIN
EXPLAIN tbl_name
返回Field、Type、Null、Key、Default、Extra这几列对应的表中每个字段的值
相当于DESCRIBE tbl_name或SHOW COLUMNS FROM tbl_name
EXPLAIN [EXTENDED] SELECT select_options
借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT
EXPLAIN为用于SELECT语句中的每个表返回一行信息
EXPLAIN的每个输出行提供一个表的相关信息,并且每个行包括下面的列:
id
SELECT识别符。这是SELECT的查询序列号。
select_type
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子句的子查询)
table
输出的行所引用的表。
type
联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
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
对于每个来自于先前的表的行组合,进行完整的表扫描。
possible_keys
possible_keys列指出MySQL能使用哪个索引在该表中找到行。
如果该列是NULL,则没有相关的索引。
在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。
为了看清一张表有什么索引,使用SHOW INDEX FROM tbl_name。
key
key列显示MySQL实际决定使用的键(索引)。
如果没有选择索引,键是NULL。
要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
ref
ref列显示使用哪个列或常数与key一起从表中选择行。
rows
rows列显示MySQL认为它执行查询时必须检查的行数。
Extra
该列包含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做一些优化
二、MySQL锁
对WRITE,MySQL使用的表锁定方法原理如下
* 如果在表上没有锁,在它上面放一个写锁。
* 否则,把锁定请求放在写锁定队列中。
对READ,MySQL使用的锁定方法原理如下:
* 如果在表上没有写锁定,把一个读锁定放在它上面。
* 否则,把锁请求放在读锁定队列中。
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
SHOW STATUS LIKE 'Table%'
三、数据库结构优化
1, 使数据尽可能小
尽可能地使用最有效(最小)的数据类型
尽可能使用较小的整数类型使表更小
如果可能,声明列为NOT NULL
对于MyISAM表,如果没有任何变长列(VARCHAR、TEXT或BLOB列),使用固定尺寸的记录格式
在MySQL/InnoDB中,InnoDB表使用更紧凑的存储格式
紧凑的InnoDB格式也改变了包含UTF-8数据的CHAR列的保存方式
每张表的主索引应该尽可能短
只创建你确实需要的索引
如果很可能一个索引在头几个字符上有唯一的前缀,仅仅索引该前缀比较好
使用列索引和多列索引
索引用于快速找出在某个列中有一特定值的行。
不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。
表越大,花费的时间越多。
如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
索引用于下面的操作:
1,快速找出匹配一个WHERE子句的行。
2,删除行。如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引。
3,当执行联接时,从其它表检索行。
4,对具体有索引的列key_col找出MAX()或MIN()值。由预处理器进行优化,检查是否对索引中在key_col之前发生所有关键字元素使用了WHERE
key_part_# = constant。
四、优化MySQL服务器
这个命令生成所有mysqld选项和可配置变量的列表:
mysqld --verbose --help
如果有一个mysqld服务器正在运行,通过连接它并执行这个命令,可以看到实际上使用的变量的值:
SHOW VARIABLES;
还可以通过下面的语句看到运行服务器的统计和状态指标:
SHOW STATUS;
通常情况若给MySQL更多的内存性能会更好。
当调节MySQL服务器时,要配置的两个最重要的变量是key_buffer_size和table_cache:
mysqld_safe --key_buffer_size=64M --table_cache=256 \ --sort_buffer_size=4M --read_buffer_size=1M &
不同的机器硬件上使用不同的编译器性能也会有不同的提高
评论
1 楼
hideto
2008-11-04
比较常用的几个tips:
1,show processlist
可以看出当前连接正在执行的SQL和SQL的执行时间、执行状态
每个连接有一个thread id,可以用“kill thread_id”命令来杀掉该SQL
2,explain @SQL
可以看出该SQL执行时所用的index、遍历的rows,如果rows特别大,则该SQL的执行效率会很差,可以用force index等方式优化index的使用来达到优化SQL的目的
3,top d 1
该linux命令可以看出mysqld进程所占用的cpu,还可以看出当前的load average即io的负载,可以根据cpu和io的效率来判断该如何优化SQL
优化SQL中join的方式:
1,使用数据较少的表来做where条件会大大减少查询结果集,速度提升是好几个数量级的
2,优化所使用的index来提升效率,避免全表扫描
3,如果实在很慢,只能加limit来改进效率
1,show processlist
可以看出当前连接正在执行的SQL和SQL的执行时间、执行状态
每个连接有一个thread id,可以用“kill thread_id”命令来杀掉该SQL
2,explain @SQL
可以看出该SQL执行时所用的index、遍历的rows,如果rows特别大,则该SQL的执行效率会很差,可以用force index等方式优化index的使用来达到优化SQL的目的
3,top d 1
该linux命令可以看出mysqld进程所占用的cpu,还可以看出当前的load average即io的负载,可以根据cpu和io的效率来判断该如何优化SQL
优化SQL中join的方式:
1,使用数据较少的表来做where条件会大大减少查询结果集,速度提升是好几个数量级的
2,优化所使用的index来提升效率,避免全表扫描
3,如果实在很慢,只能加limit来改进效率
发表评论
-
HPM Note5, Query Performance Optimization
2009-07-21 18:05 1482Slow Query Basics: Optimize Dat ... -
HPM Note4, Schema Optimization and Indexing
2009-07-16 18:04 1487Choosing Optimal Data Types Sma ... -
HPM Note3, Benchmarking and Profiling
2009-07-02 14:07 1501Note3, Finding Bottlenecks: Ben ... -
HPM Note2, MySQL Architecture
2009-06-30 17:13 1763MySQL's Logical Architecture Th ... -
HPM Note1,Book Organization
2009-06-23 09:49 1636How This Book Is Organization ... -
MySQL Architecture
2009-01-18 00:12 3105MySQL Core Modules: Server In ... -
MySQL里获取当前week、month、quarter的start_date/end_date
2008-10-21 14:14 7460当前week的第一天: select date_sub(cur ... -
mysql里找出一个表的主键被谁作为外键约束
2008-08-13 17:16 2187SELECT ke.referenced_table_n ... -
SQL性能调优:2.1 排序的一般性调优
2008-08-05 10:21 3576影响排序速度的原因(从大到小): 1,选择的行数 2,ORDE ... -
TCP-IP详解笔记1.5 RARP:逆地址解析协议
2008-07-25 14:05 2281from http://www.beyondrails.com ... -
SQL性能调优:1.3 其他语法调优
2008-07-25 13:38 1390from http://www.beyondrails.com ... -
SQL性能调优:1.2 特别语法调优
2008-07-24 12:15 2704from http://www.beyondrails.com ... -
SQL性能调优:1.1 一般性语法调优
2008-07-23 14:47 2542from http://www.beyondrails.com ... -
MySQL存储程序开发最佳实践
2008-05-28 13:56 1692MySQL存储程序开发最佳 ... -
MySQL join的文章
2008-05-28 13:00 1569MySQL的联结(Join)语法 -
MySQL索引系列文章
2008-05-28 12:51 1473MySQL索引使用 MySQL索引 MySQL 5.1参考手册 ... -
MySQL存储程序权限控制
2008-05-28 12:29 1406MySQL存储程序权限控制 MySQL5.0引入了一些管理存 ... -
MySQL的Stored Function和Trigger
2008-05-27 18:58 3131MySQL的Stored Function和Trigger ... -
MySQL内建Function
2008-05-22 17:25 6548MySQL内建Function 在MySQL存储程序(存储过 ... -
MySQL存储过程之事务管理
2008-05-21 14:36 44946MySQL存储过程之事务管理 ACID:Atomic、Con ...
相关推荐
以下是一份详细的MySQL优化笔记,涵盖了多个方面: 一、查询优化 1. 使用索引:为经常用于搜索的列创建索引可以显著加快查询速度。B树和哈希索引是最常见的类型,适用于不同的查询场景。 2. 避免全表扫描:尽量使用...
里面结合了我整理的笔记希望对大家有用,请大家多多支持
这份"Mysql优化笔记"的资源,结合了网盘视频教程,为学习者提供了全面而深入的学习材料,旨在帮助那些希望在MySQL优化领域深化理解的人。 首先,MySQL优化主要分为几个核心部分: 1. **SQL查询优化**:这是最基本...
这份"mysql优化笔记(加强版)"包含了十八哥的MySQL优化笔记和一些大牛的讲解,提供了丰富的图片和文档,是学习和准备MySQL优化面试问题的理想资料。 一、查询优化 1. **查询语句优化**:避免全表扫描,使用索引来...
【MySQL优化笔记——相关图片】 在数据库管理领域,MySQL是一个广泛应用的关系型数据库管理系统,它以其高效、稳定和开源的特点赢得了全球开发者的喜爱。然而,随着数据量的增长和业务复杂性的提升,MySQL的性能...
MySQL优化笔记和资料,配套视频:https://www.bilibili.com/list/474327672?sid=4493847&spm_id_from=333.999.0.0&desc=1
韩顺平mysql优化笔记.doc Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] c: 分表...
MySQL数据库的优化是一个涵盖多个方面的复杂任务,旨在提高性能、减少资源消耗并确保系统的稳定性。以下是一些关键的优化策略: 1. **表的设计合理化(3NF)**: - **第一范式(1NF)**:确保每一列都具有原子性,...
包含内容:MySQL入门到精通经典教程;MySQL优化讲义;MySQL优化笔记;SQL优化思路;索引学习;MySQL服务器调优思路;
MySQL优化是数据库管理中的关键环节,它涉及...文件"MySQL优化笔记-整理版.doc"、"sql优化.png"、"索引学习.png"、"MySQL服务器调优思路.png"和"mysql优化.ppt"提供了更详细的资料,有助于深入理解和应用这些优化技巧。
Q: 为什么别人问你MySQL优化的知识 总是没有底气. A: 因为你只是回答一些大而化之的调优原则, 比如:”建立合理索引”(什么样的索引合理?) “分表分库”(用什么策略分表分库?) “主从分离”(用什么中间件?) 并没有从...
本笔记将深入探讨MySQL优化的关键知识点,包括但不限于索引优化、查询语句优化、存储引擎选择、数据库架构设计以及内存配置等方面。 首先,索引是MySQL数据库中提升查询速度的关键。正确地为经常用于查询的列创建...
### MySQL优化知识点详解 在日常的数据库管理与维护过程中,MySQL优化是一项至关重要的工作,它不仅能够提升数据库的性能,还能提高数据处理的效率。本文将根据提供的标题、描述及部分内容,深入探讨MySQL优化的...
根据提供的文件信息,我们可以整理出一系列关于MySQL优化的关键知识点,主要围绕系统监控、数据库性能调优、硬件选择以及系统配置等方面展开。 ### 一、系统监控 #### 1.1 系统性能指标 - **CPU**: CPU是衡量...
MySQL优化涉及多个层面,从合理的数据库设计到精细化的SQL语句编写,再到硬件资源的有效配置,每个环节都对整体性能有着重要影响。通过对上述知识点的深入理解和实践,可以显著提升MySQL数据库的运行效率和稳定性,...