SlideShare a Scribd company logo
1 of 37
MySQL 介绍和优化分
享
2009-07
作者:hei yel ur en( 黑夜路人)
博客:ht t p: / / bl og. csdn. net / hei yeshuwu
 MySQLMySQL 基本介绍基本介绍
 MySQLMySQL 优化方式优化方式
 MySQLMySQL 技巧分享技巧分享
 QQ && AA
目录索引目录索引
MySQLMySQL 基本介基本介
绍绍
什么是什么是 MySQLMySQL
     MySQLMySQL 是一个小型关系型数据库管理系统,开发者为瑞典是一个小型关系型数据库管理系统,开发者为瑞典
MySQL ABMySQL AB 公司。目前公司。目前 MySQLMySQL 被广泛地应用在被广泛地应用在 InternetInternet 上的中小上的中小
型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开
放源码这一特点,许多中小型网站为了降低网站总体拥有成本而放源码这一特点,许多中小型网站为了降低网站总体拥有成本而
选择了选择了 MySQLMySQL 作为网站数据库。作为网站数据库。
MySQLMySQL 官方网站:官方网站: http://www.mysql.comhttp://www.mysql.com
谁在用谁在用 MySQLMySQL
MySQLMySQL 历史历史
•19791979 年, 报表工具,数据引擎年, 报表工具,数据引擎
•19961996 年,年, MySQL 1.0 (3.11.1)MySQL 1.0 (3.11.1) 发布,支持发布,支持 SQLSQL
•20002000 年,成立年,成立 MySQL ABMySQL AB 公司公司
•20082008 年年 11 月,月, SunSun 公司以公司以 1010 亿美元收购亿美元收购 MySQL ABMySQL AB
公司公司
•20092009 年年 44 月,月, OracleOracle 公司以公司以 7474 亿美元收购亿美元收购 SunSun 公司公司
MySQLMySQL 里里
程碑程碑
•3.11.1 First public release3.11.1 First public release
•3.233.23 集成集成 Berkeley DB,Berkeley DB, 支持事务,抽象出支持事务,抽象出 Storage EngineStorage Engine
•4.04.0 集成集成 InnoDBInnoDB
•4.14.1 重大改进,子查询、重大改进,子查询、 unicodeunicode 、、 c/sc/s 通信协议通信协议
•5.0 stored procedure5.0 stored procedure 、、 viewview 、、 triggerstriggers 、、 query optimizerquery optimizer
•5.1 File NDB5.1 File NDB 、、 record replication......record replication......
MySQLMySQL 架构架构
MySQLMySQL 存储引擎比较存储引擎比较
MyISAMMyISAM 特点特点
MyISAM vs InnoDBMyISAM vs InnoDB
• 数据存储方式简单,使用数据存储方式简单,使用 B+ TreeB+ Tree 进行索引进行索引
• 使用三个文件定义一个表:使用三个文件定义一个表: .MYI .MYD .frm.MYI .MYD .frm
• 少碎片、支持大文件、能够进行索引压缩少碎片、支持大文件、能够进行索引压缩
• 二进制层次的文件可以移植二进制层次的文件可以移植 (Linux(Linux  Windows)Windows)
• 访问速度飞快,是所有访问速度飞快,是所有 MySQLMySQL 文件引擎中速度最快的文件引擎中速度最快的
• 不支持一些数据库特性,比如 事务、外键约束等不支持一些数据库特性,比如 事务、外键约束等
• Table level lockTable level lock ,性能稍差,更适合读取多的操作,性能稍差,更适合读取多的操作
• 表数据容量有限,一般建议单表数据量介于表数据容量有限,一般建议单表数据量介于 50w–200w50w–200w
• 增删查改以后要使用增删查改以后要使用 myisamchkmyisamchk 检查优化表检查优化表
MyISAMMyISAM 存储结构存储结构
MyISAM vs InnoDBMyISAM vs InnoDB
MyISAMMyISAM 索引结构索引结构
MyISAM vs InnoDBMyISAM vs InnoDB
InnoDBInnoDB 特点特点
MyISAM vs InnoDBMyISAM vs InnoDB
•使用使用 Table SpaceTable Space 的方式来进行数据存储的方式来进行数据存储 ((ibdata1,ibdata1,
ib_logfile0ib_logfile0))
• 支持 事务、外键约束等数据库特性支持 事务、外键约束等数据库特性
• Rows level lock ,Rows level lock , 读写性能都非常优秀读写性能都非常优秀
• 能够承载大数据量的存储和访问能够承载大数据量的存储和访问
• 拥有自己独立的缓冲池,能够缓存数据和索引拥有自己独立的缓冲池,能够缓存数据和索引
• 在关闭自动提交的情况下,与在关闭自动提交的情况下,与 MyISAMMyISAM 引擎速度差异不大引擎速度差异不大
InnoDBInnoDB 数据结构数据结构
MyISAM vs InnoDBMyISAM vs InnoDB
MyISAM vs InnoDBMyISAM vs InnoDB 性能测性能测
试试
数据量 / 单位 : 万 MyISAM InnoDB 备注 : my.cnf 特殊选项
插入: 1w 3 秒 219 秒 innodb_flush_log_at_trx_commit=1
插入: 10w 29 秒 2092 秒 innodb_flush_log_at_trx_commit=1
插入: 100w 287 秒 N/A innodb_flush_log_at_trx_commit=1
插入: 1w 3 秒 3 秒 innodb_flush_log_at_trx_commit=0
插入: 10w 30 秒 29 秒 innodb_flush_log_at_trx_commit=0
插入: 100w 273 秒 423 秒 innodb_flush_log_at_trx_commit=0
插入:插入: 1w1w N/AN/A 33 秒秒 innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=256M
插入:插入: 10W10W N/AN/A 2626 秒秒 innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=256M
插入:插入: 100W100W N/AN/A 379379 秒秒 innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=256M
测试结果测试结果
MyISAM vs InnoDBMyISAM vs InnoDB 性能性能
测试测试
可以看出在 MySQL 5.0 里面, MyISAM 和 InnoDB 存储引擎性能差别
并不是很大,针对 InnoDB 来说,影响性能的主要是
innodb_flush_log_at_trx_commitinnodb_flush_log_at_trx_commit 这个选项,如果设置为这个选项,如果设置为 11 的话,那么的话,那么
每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷
新日志有关系,设置为新日志有关系,设置为 00 效率能够看到明显提升,当然,同样你可以效率能够看到明显提升,当然,同样你可以
SQLSQL 中提交“中提交“ SET AUTOCOMMIT = 0”SET AUTOCOMMIT = 0” 来设置达到好的性能。来设置达到好的性能。
同时也可以看出值得使用同时也可以看出值得使用 InnoDBInnoDB 来替代来替代 MyISAMMyISAM 引擎来进行开发引擎来进行开发
,毕竟,毕竟 InnoDBInnoDB 有多数据库特性、更良好的数据存储性能和查询性能有多数据库特性、更良好的数据存储性能和查询性能
MySQLMySQL 优化方优化方
式式
 系统优化:硬件、架构系统优化:硬件、架构
 服务优化服务优化
 应用优化应用优化
MySQLMySQL 优化方式优化方式
 使用好的硬件,更快的硬盘、大内存、多核使用好的硬件,更快的硬盘、大内存、多核 CPUCPU ,专,专
业的存储服务器(业的存储服务器( NASNAS 、、 SANSAN ))
 设计合理架构,如果设计合理架构,如果 MySQLMySQL 访问频繁,考虑访问频繁,考虑
Master/SlaveMaster/Slave 读写分离;数据库分表、数据库切片读写分离;数据库分表、数据库切片
(分布式),也考虑使用相应缓存服务帮助(分布式),也考虑使用相应缓存服务帮助 MySQLMySQL
缓解访问压力缓解访问压力
系统优化系统优化
 配置合理的配置合理的 MySQLMySQL 服务器,尽量在应用本身达到一个服务器,尽量在应用本身达到一个
MySQLMySQL 最合理的使用最合理的使用
 针对针对 MyISAMMyISAM 或或 InnoDBInnoDB 不同引擎进行不同定制性不同引擎进行不同定制性
配置配置
 针对不同的应用情况进行合理配置针对不同的应用情况进行合理配置
 针对针对 my.cnfmy.cnf 进行配置,后面设置是针对内存为进行配置,后面设置是针对内存为 2G2G 的的
服务器进行的合理设置服务器进行的合理设置
服务优化服务优化
MySQLMySQL 配置原则配置原则
服务优化服务优化
公共选项公共选项
选项 缺省值 推荐值 说明
max_connections 100 1024 MySQL 服务器同时处理的数据库连接的最大数量
query_cache_size 0 ( 不打开) 16M 查询缓存区的最大长度,按照当前需求,一倍一倍
增加,本选项比较重要
sort_buffer_size 512K 16M 每个线程的排序缓存大小,一般按照内存可以设置
为 2M 以上,推荐是 16M ,该选项对排序 order
by , group by 起作用
record_buffer 128K 16M 每个进行一个顺序扫描的线程为其扫描的每张表分
配这个大小的一个缓冲区,可以设置为 2M 以上
table_cache 64 512 为所有线程打开表的数量。增加该值能增加 mysqld
要求的文件描述符的数量。 MySQL 对每个唯一打
开的表需要 2 个文件描述符。
服务优化服务优化
MyISAMMyISAM 选项选项
选项 缺省值 推荐值 说明
key_buffer_size 8M 256M 用来存放索引区块的缓存值 , 建议 128M 以
上,不要大于内存的 30%
read_buffer_size 128K 16M 用来做 MyISAM 表全表扫描的缓冲大小 .
为从数据表顺序读取数据的读操作保留的缓
存区的长度
myisam_sort_buffer_si
ze
16M 128M 设置 , 恢复 , 修改表的时候使用的缓冲大小
,值不要设的太大
服务优化服务优化
InnoDBInnoDB 选项选项
选项 缺省值 推荐值 说明
innodb_buffer_pool_size 32M 1G InnoDB 使用一个缓冲池来保存索引和原始数据 ,
这里你设置越大 , 你在存取表里面数据时所需要的
磁盘 I/O 越少,一般是内存的一半,不超过 2G ,
否则系统会崩溃,这个参数非常重要
innodb_additional_mem_p
ool_size
2M 128M InnoDB 用来保存 metadata 信息 , 如果内存是
4G ,最好本值超过 200M
innodb_flush_log_at_trx_co
mmit
1 0 0 代表日志只大约每秒写入日志文件并且日志文件刷新到
磁盘 ; 1 为执行完没执行一条 SQL 马上 commit; 2 代表日
志写入日志文件在每次提交后 , 但是日志文件只有大约每秒
才会刷新到磁盘上 . 对速度影响比较大,同时也关系数据
完整性
innodb_log_file_size 8M 256M 在日志组中每个日志文件的大小 , 一般是
innodb_buffer_pool_size 的 25% ,官方推荐是
innodb_buffer_pool_size 的 40-50%, 设置大一点
来避免在日志文件覆写上不必要的缓冲池刷新行为
innodb_log_buffer_size 128K 8M 用来缓冲日志数据的缓冲区的大小 . 推荐是 8M ,
官方推荐该值小于 16M ,最好是 1M-8M 之间
 设计合理的数据表结构:适当的数据冗余设计合理的数据表结构:适当的数据冗余
 对数据表建立合适有效的数据库索引对数据表建立合适有效的数据库索引
 数据查询:编写简洁高效的数据查询:编写简洁高效的 SQLSQL 语句语句
应用优化应用优化
应用优化方式应用优化方式
应用优化应用优化
表结构设计原则表结构设计原则
 选择合适的数据类型:如果能够定长尽量定长选择合适的数据类型:如果能够定长尽量定长
 不要使用无法加索引的类型作为关键字段,比如不要使用无法加索引的类型作为关键字段,比如 texttext
类型类型
 为了避免联表查询,有时候可以适当的数据冗余,比为了避免联表查询,有时候可以适当的数据冗余,比
如如
邮箱、姓名这些不容易更改的数据邮箱、姓名这些不容易更改的数据
 选择合适的表引擎,有时候选择合适的表引擎,有时候 MyISAMMyISAM 适合,有时候适合,有时候
InnoDBInnoDB 适合适合
 为保证查询性能,最好每个表都建立有为保证查询性能,最好每个表都建立有
auto_incrementauto_increment
字段, 建立合适的数据库索引字段, 建立合适的数据库索引
 最好给每个字段都设定最好给每个字段都设定 defaultdefault 值值
应用优化应用优化
索引建立原则索引建立原则
 一般针对数据分散的关键字进行建立索引,比如一般针对数据分散的关键字进行建立索引,比如
IDID 、、 QQQQ ,,
像性别、状态值等等建立索引没有意义像性别、状态值等等建立索引没有意义
 尽量使用短索引,一般对尽量使用短索引,一般对 intint 、、 char/varcharchar/varchar 、、 date/timedate/time
等等
类型的字段建立索引类型的字段建立索引
 需要的时候建立联合索引,但是要注意查询需要的时候建立联合索引,但是要注意查询 SQLSQL 语句的语句的
编写编写
 谨慎建立谨慎建立 uniqueunique 类型的索引(唯一索引)类型的索引(唯一索引)
 一般建议每条记录最好有一个能快速定位的独一无二定一般建议每条记录最好有一个能快速定位的独一无二定
位的位的
唯一标示(索引)唯一标示(索引)
 不要过度索引,单表建立的索引不要超过不要过度索引,单表建立的索引不要超过 55 个,否则更个,否则更
新索新索
应用优化应用优化
编写高效的编写高效的 SQLSQL
 能够快速缩小结果集的能够快速缩小结果集的 WHEREWHERE 条件写在前面,如果有恒量条条件写在前面,如果有恒量条
件,件,
也尽量放在前面也尽量放在前面
 尽量避免使用尽量避免使用 GROUP BYGROUP BY 、、 DISTINCTDISTINCT 、、 OROR 、、 ININ 等语句的使等语句的使
用,用,
避免使用联表查询和子查询,因为将使执行效率大大下降避免使用联表查询和子查询,因为将使执行效率大大下降
 能够使用索引的字段尽量进行有效的合理排列,如果使用了能够使用索引的字段尽量进行有效的合理排列,如果使用了
联合索引,请注意提取字段的前后顺序联合索引,请注意提取字段的前后顺序
 针对索引字段使用针对索引字段使用 >, >=, =, <, <=, IF NULL>, >=, =, <, <=, IF NULL 和和 BETWEENBETWEEN 将会使将会使
用用
索引, 如果对某个索引字段进行索引, 如果对某个索引字段进行 LIKELIKE 查询,使用查询,使用 LIKELIKE
‘%abc%’‘%abc%’
不能使用索引,使用不能使用索引,使用 LIKE ‘abc%’LIKE ‘abc%’ 将能够使用索引将能够使用索引
 如果在如果在 SQLSQL 里使用了里使用了 MySQLMySQL 部分自带函数,索引将失效,同时部分自带函数,索引将失效,同时
将无法将无法
使用使用 MySQLMySQL 的的 Query CacheQuery Cache ,比如,比如 LEFT(), SUBSTR(),LEFT(), SUBSTR(),
MySQLMySQL 技巧分技巧分
享享
MySQLMySQL 技巧分享技巧分享
常用技巧常用技巧
 使用使用 Explain/ DESCExplain/ DESC 来分析来分析 SQLSQL 的执行情况的执行情况
 使用使用 SHOW PROCESSLISTSHOW PROCESSLIST 来查看当前来查看当前 MySQLMySQL 服务器服务器
线程线程
执行情况,是否锁表,查看相应的执行情况,是否锁表,查看相应的 SQLSQL 语句语句
 设置设置 my.cnfmy.cnf 中的中的 long-query-timelong-query-time 和和 log-slow-querieslog-slow-queries
能够能够
记录服务器那些记录服务器那些 SQLSQL 执行速度比较慢执行速度比较慢
 另外有用的几个查询:另外有用的几个查询: SHOW VARIABLESSHOW VARIABLES 、、 SHOWSHOW
STATUSSTATUS 、、 SHOW ENGINESSHOW ENGINES
 使用使用 DESC TABLE xxxDESC TABLE xxx 来查看表结构,使用来查看表结构,使用 SHOWSHOW
INDEXINDEX
FROM xxxFROM xxx 来查看表索引来查看表索引
 使用使用 LOAD DATALOAD DATA 导入数据比导入数据比 INSERT INTOINSERT INTO 快多了快多了
 SELECT COUNT(*) FROM TblSELECT COUNT(*) FROM Tbl 在在 InnoDBInnoDB 中将会扫描中将会扫描
全表全表
MySQLMySQL 技巧分享技巧分享
ExplainExplain 使用使用
 语法:语法: EXPLAIN SELECTEXPLAIN SELECT select_optionsselect_options
Type:Type: 类型,是否使用了索引还是全表扫描类型,是否使用了索引还是全表扫描 , const,eg_reg,ref,range,index,ALL, const,eg_reg,ref,range,index,ALL
Key:Key: 实际使用上的索引是哪个字段实际使用上的索引是哪个字段
Ken_len:Ken_len: 真正使用了哪些索引,不为真正使用了哪些索引,不为 NULLNULL 的就是真实使用的索引的就是真实使用的索引
Ref:Ref: 显示了哪些字段或者常量被用来和显示了哪些字段或者常量被用来和 keykey 配合从表中查询记录出来配合从表中查询记录出来
Rows:Rows: 显示了显示了 MySQLMySQL 认为在查询中应该检索的记录数认为在查询中应该检索的记录数
Extra:Extra: 显示了查询中显示了查询中 MySQLMySQL 的附加信息,关心的附加信息,关心 Using filesortUsing filesort 和和 Using temporaryUsing temporary ,性能杀,性能杀
手手
MySQLMySQL 技巧分享技巧分享
索引实践索引实践
MySQLMySQL 技巧分享技巧分享
函数和索引函数和索引
MySQLMySQL 技巧分享技巧分享
使用使用 UNIONUNION 来取代来取代 ININ 和和 OROR
原原 SQLSQL ::
select * from city where id in (1,3,4)select * from city where id in (1,3,4) 或或 select * from city where id = 1 or id = 3 or id = 4select * from city where id = 1 or id = 3 or id = 4
explainexplain 结果:结果:
id select_type table type possible_keys key key_len ref rows Extraid select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE city ALL PRIMARY NULL NULL NULL1 SIMPLE city ALL PRIMARY NULL NULL NULL 5 Using where5 Using where
修改后修改后 SQLSQL ::
SELECT * FROM city where id = 1SELECT * FROM city where id = 1
UNION ALL SELECT * FROM city where id = 3UNION ALL SELECT * FROM city where id = 3
UNION ALL SELECT * FROM cityUNION ALL SELECT * FROM city
explainexplain 结果:结果:
id select_type table type possible_keys key key_len ref rows Extraid select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY city const PRIMARY PRIMARY 41 PRIMARY city const PRIMARY PRIMARY 4 const 1const 1
2 UNION city const PRIMARY PRIMARY 42 UNION city const PRIMARY PRIMARY 4 const 1const 1
3 UNION city const PRIMARY PRIMARY 43 UNION city const PRIMARY PRIMARY 4 const 1const 1
NULL UNION RESULT <union1,2,3> ALL NULL NULL NULL NULL NULLNULL UNION RESULT <union1,2,3> ALL NULL NULL NULL NULL NULL
MySQLMySQL 技巧分享技巧分享
MySQL Slow LogMySQL Slow Log 分析工具分析工具
 mysqldumpslow - mysqlmysqldumpslow - mysql 官方提供的慢查询日志分析工具官方提供的慢查询日志分析工具
 mysqlsla - hackmysql.commysqlsla - hackmysql.com 推出的一款日志分析工具,功能推出的一款日志分析工具,功能
非常强大非常强大
 mysql-explain-slow-logmysql-explain-slow-log –– 德国工程师使用德国工程师使用 PerlPerl 开发的把开发的把
SlowSlow
LogLog 输出到屏幕,功能简单输出到屏幕,功能简单
 mysql-log-filter - Google codemysql-log-filter - Google code 上一个开源产品,报表简洁上一个开源产品,报表简洁
 myprofi -myprofi - 纯纯 PHPPHP 开发的开源开发的开源 loglog 查看工具,功能详细查看工具,功能详细
MySQLMySQL 技巧分享技巧分享
MySQLMySQL 优化网站优化网站 // 书籍分享书籍分享
 MySQL Performance BlogMySQL Performance Blog
 MySQLMySQL 中文网中文网
《《 MySQLMySQL 性能调优与架构设计性能调优与架构设计 》》
《《深入浅出深入浅出 MySQLMySQL 》》
Q & AQ & A
结束结束
大家!谢谢大家!谢谢

More Related Content

Viewers also liked

Social Mobile Local and Email Marketing
Social Mobile Local and Email MarketingSocial Mobile Local and Email Marketing
Social Mobile Local and Email MarketingSilverpop
 
Ama.digital marketingstrategy.10 13.
Ama.digital marketingstrategy.10 13.Ama.digital marketingstrategy.10 13.
Ama.digital marketingstrategy.10 13.Bob Johnson, Ph.D.
 
QENGJI ËSHTË I DENJË - Zbulesa 5
QENGJI ËSHTË I DENJË - Zbulesa 5QENGJI ËSHTË I DENJË - Zbulesa 5
QENGJI ËSHTË I DENJË - Zbulesa 5Asambleja Biblike
 

Viewers also liked (6)

Social Mobile Local and Email Marketing
Social Mobile Local and Email MarketingSocial Mobile Local and Email Marketing
Social Mobile Local and Email Marketing
 
Jaime
JaimeJaime
Jaime
 
Photoparsa album
Photoparsa album Photoparsa album
Photoparsa album
 
ZBULESA 1 - Pjesa I
ZBULESA 1 - Pjesa IZBULESA 1 - Pjesa I
ZBULESA 1 - Pjesa I
 
Ama.digital marketingstrategy.10 13.
Ama.digital marketingstrategy.10 13.Ama.digital marketingstrategy.10 13.
Ama.digital marketingstrategy.10 13.
 
QENGJI ËSHTË I DENJË - Zbulesa 5
QENGJI ËSHTË I DENJË - Zbulesa 5QENGJI ËSHTË I DENJË - Zbulesa 5
QENGJI ËSHTË I DENJË - Zbulesa 5
 

Similar to Mysql introduction-and-performance-optimization

Sina my sq概述及优化
Sina my sq概述及优化Sina my sq概述及优化
Sina my sq概述及优化pigso
 
基于Innodb开发的最佳实践
基于Innodb开发的最佳实践基于Innodb开发的最佳实践
基于Innodb开发的最佳实践wubx
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结Lixun Peng
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocketpwesh
 
My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规isnull
 
MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规mysqlops
 
MySQL快速入门与提高
MySQL快速入门与提高MySQL快速入门与提高
MySQL快速入门与提高mysqlpub
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renrend0nn9n
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast sharerfyiamcool
 
数据库极限性能测试
数据库极限性能测试数据库极限性能测试
数据库极限性能测试helbreathszw
 
twMVC#19 | opserver監控服務的解決
twMVC#19 | opserver監控服務的解決twMVC#19 | opserver監控服務的解決
twMVC#19 | opserver監控服務的解決twMVC
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析iammutex
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化colderboy17
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化guiyingshenxia
 
Mysql遇到的一些问题
Mysql遇到的一些问题Mysql遇到的一些问题
Mysql遇到的一些问题wang tongchao
 
第一讲 My sql初步
第一讲 My sql初步第一讲 My sql初步
第一讲 My sql初步hjl888666
 
Mysql proxy cluster
Mysql proxy clusterMysql proxy cluster
Mysql proxy clusterYiwei Ma
 

Similar to Mysql introduction-and-performance-optimization (20)

Sina my sq概述及优化
Sina my sq概述及优化Sina my sq概述及优化
Sina my sq概述及优化
 
基于Innodb开发的最佳实践
基于Innodb开发的最佳实践基于Innodb开发的最佳实践
基于Innodb开发的最佳实践
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规My sql数据库开发的三十六条军规
My sql数据库开发的三十六条军规
 
MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规MySQL数据库开发的三十六条军规
MySQL数据库开发的三十六条军规
 
MySQL快速入门与提高
MySQL快速入门与提高MySQL快速入门与提高
MySQL快速入门与提高
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
 
Mysql fast share
Mysql fast shareMysql fast share
Mysql fast share
 
数据库极限性能测试
数据库极限性能测试数据库极限性能测试
数据库极限性能测试
 
Optimzing mysql
Optimzing mysqlOptimzing mysql
Optimzing mysql
 
twMVC#19 | opserver監控服務的解決
twMVC#19 | opserver監控服務的解決twMVC#19 | opserver監控服務的解決
twMVC#19 | opserver監控服務的解決
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化
 
Mysql遇到的一些问题
Mysql遇到的一些问题Mysql遇到的一些问题
Mysql遇到的一些问题
 
第一讲 My sql初步
第一讲 My sql初步第一讲 My sql初步
第一讲 My sql初步
 
Mysql proxy cluster
Mysql proxy clusterMysql proxy cluster
Mysql proxy cluster
 

More from isnull

站点报告模板
站点报告模板站点报告模板
站点报告模板isnull
 
基于Web的项目管理工具redmine
基于Web的项目管理工具redmine基于Web的项目管理工具redmine
基于Web的项目管理工具redmineisnull
 
雷志兴 百度前端基础平台与架构分享
雷志兴 百度前端基础平台与架构分享雷志兴 百度前端基础平台与架构分享
雷志兴 百度前端基础平台与架构分享isnull
 
张勇 搜搜前端架构
张勇 搜搜前端架构张勇 搜搜前端架构
张勇 搜搜前端架构isnull
 
张克军 豆瓣前端团队的工作方式
张克军 豆瓣前端团队的工作方式张克军 豆瓣前端团队的工作方式
张克军 豆瓣前端团队的工作方式isnull
 
杨皓 新浪博客前端架构分享
杨皓 新浪博客前端架构分享杨皓 新浪博客前端架构分享
杨皓 新浪博客前端架构分享isnull
 
Barcelona apc mem2010
Barcelona apc mem2010Barcelona apc mem2010
Barcelona apc mem2010isnull
 
Designofhtml5
Designofhtml5Designofhtml5
Designofhtml5isnull
 
Mysql开发与优化
Mysql开发与优化Mysql开发与优化
Mysql开发与优化isnull
 
我的Ubuntu之旅
我的Ubuntu之旅我的Ubuntu之旅
我的Ubuntu之旅isnull
 
软件工程&架构
软件工程&架构软件工程&架构
软件工程&架构isnull
 
淘宝分布式数据处理实践
淘宝分布式数据处理实践淘宝分布式数据处理实践
淘宝分布式数据处理实践isnull
 
阿里巴巴 招聘技巧培训
阿里巴巴 招聘技巧培训阿里巴巴 招聘技巧培训
阿里巴巴 招聘技巧培训isnull
 
183银行服务器下载说明
183银行服务器下载说明183银行服务器下载说明
183银行服务器下载说明isnull
 
人人网技术经理张铁安 Feed系统结构浅析
人人网技术经理张铁安 Feed系统结构浅析人人网技术经理张铁安 Feed系统结构浅析
人人网技术经理张铁安 Feed系统结构浅析isnull
 
Data on the web
Data on the webData on the web
Data on the webisnull
 
Tsung
Tsung Tsung
Tsung isnull
 
Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010isnull
 

More from isnull (20)

站点报告模板
站点报告模板站点报告模板
站点报告模板
 
基于Web的项目管理工具redmine
基于Web的项目管理工具redmine基于Web的项目管理工具redmine
基于Web的项目管理工具redmine
 
雷志兴 百度前端基础平台与架构分享
雷志兴 百度前端基础平台与架构分享雷志兴 百度前端基础平台与架构分享
雷志兴 百度前端基础平台与架构分享
 
张勇 搜搜前端架构
张勇 搜搜前端架构张勇 搜搜前端架构
张勇 搜搜前端架构
 
张克军 豆瓣前端团队的工作方式
张克军 豆瓣前端团队的工作方式张克军 豆瓣前端团队的工作方式
张克军 豆瓣前端团队的工作方式
 
杨皓 新浪博客前端架构分享
杨皓 新浪博客前端架构分享杨皓 新浪博客前端架构分享
杨皓 新浪博客前端架构分享
 
Barcelona apc mem2010
Barcelona apc mem2010Barcelona apc mem2010
Barcelona apc mem2010
 
Designofhtml5
Designofhtml5Designofhtml5
Designofhtml5
 
Mysql开发与优化
Mysql开发与优化Mysql开发与优化
Mysql开发与优化
 
我的Ubuntu之旅
我的Ubuntu之旅我的Ubuntu之旅
我的Ubuntu之旅
 
软件工程&架构
软件工程&架构软件工程&架构
软件工程&架构
 
淘宝分布式数据处理实践
淘宝分布式数据处理实践淘宝分布式数据处理实践
淘宝分布式数据处理实践
 
阿里巴巴 招聘技巧培训
阿里巴巴 招聘技巧培训阿里巴巴 招聘技巧培训
阿里巴巴 招聘技巧培训
 
Scrum
ScrumScrum
Scrum
 
Scrum
ScrumScrum
Scrum
 
183银行服务器下载说明
183银行服务器下载说明183银行服务器下载说明
183银行服务器下载说明
 
人人网技术经理张铁安 Feed系统结构浅析
人人网技术经理张铁安 Feed系统结构浅析人人网技术经理张铁安 Feed系统结构浅析
人人网技术经理张铁安 Feed系统结构浅析
 
Data on the web
Data on the webData on the web
Data on the web
 
Tsung
Tsung Tsung
Tsung
 
Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010Dutch php conference_apc_mem2010
Dutch php conference_apc_mem2010
 

Mysql introduction-and-performance-optimization

  • 1. MySQL 介绍和优化分 享 2009-07 作者:hei yel ur en( 黑夜路人) 博客:ht t p: / / bl og. csdn. net / hei yeshuwu
  • 2.  MySQLMySQL 基本介绍基本介绍  MySQLMySQL 优化方式优化方式  MySQLMySQL 技巧分享技巧分享  QQ && AA 目录索引目录索引
  • 4. 什么是什么是 MySQLMySQL      MySQLMySQL 是一个小型关系型数据库管理系统,开发者为瑞典是一个小型关系型数据库管理系统,开发者为瑞典 MySQL ABMySQL AB 公司。目前公司。目前 MySQLMySQL 被广泛地应用在被广泛地应用在 InternetInternet 上的中小上的中小 型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开 放源码这一特点,许多中小型网站为了降低网站总体拥有成本而放源码这一特点,许多中小型网站为了降低网站总体拥有成本而 选择了选择了 MySQLMySQL 作为网站数据库。作为网站数据库。 MySQLMySQL 官方网站:官方网站: http://www.mysql.comhttp://www.mysql.com
  • 6. MySQLMySQL 历史历史 •19791979 年, 报表工具,数据引擎年, 报表工具,数据引擎 •19961996 年,年, MySQL 1.0 (3.11.1)MySQL 1.0 (3.11.1) 发布,支持发布,支持 SQLSQL •20002000 年,成立年,成立 MySQL ABMySQL AB 公司公司 •20082008 年年 11 月,月, SunSun 公司以公司以 1010 亿美元收购亿美元收购 MySQL ABMySQL AB 公司公司 •20092009 年年 44 月,月, OracleOracle 公司以公司以 7474 亿美元收购亿美元收购 SunSun 公司公司
  • 7. MySQLMySQL 里里 程碑程碑 •3.11.1 First public release3.11.1 First public release •3.233.23 集成集成 Berkeley DB,Berkeley DB, 支持事务,抽象出支持事务,抽象出 Storage EngineStorage Engine •4.04.0 集成集成 InnoDBInnoDB •4.14.1 重大改进,子查询、重大改进,子查询、 unicodeunicode 、、 c/sc/s 通信协议通信协议 •5.0 stored procedure5.0 stored procedure 、、 viewview 、、 triggerstriggers 、、 query optimizerquery optimizer •5.1 File NDB5.1 File NDB 、、 record replication......record replication......
  • 10. MyISAMMyISAM 特点特点 MyISAM vs InnoDBMyISAM vs InnoDB • 数据存储方式简单,使用数据存储方式简单,使用 B+ TreeB+ Tree 进行索引进行索引 • 使用三个文件定义一个表:使用三个文件定义一个表: .MYI .MYD .frm.MYI .MYD .frm • 少碎片、支持大文件、能够进行索引压缩少碎片、支持大文件、能够进行索引压缩 • 二进制层次的文件可以移植二进制层次的文件可以移植 (Linux(Linux  Windows)Windows) • 访问速度飞快,是所有访问速度飞快,是所有 MySQLMySQL 文件引擎中速度最快的文件引擎中速度最快的 • 不支持一些数据库特性,比如 事务、外键约束等不支持一些数据库特性,比如 事务、外键约束等 • Table level lockTable level lock ,性能稍差,更适合读取多的操作,性能稍差,更适合读取多的操作 • 表数据容量有限,一般建议单表数据量介于表数据容量有限,一般建议单表数据量介于 50w–200w50w–200w • 增删查改以后要使用增删查改以后要使用 myisamchkmyisamchk 检查优化表检查优化表
  • 13. InnoDBInnoDB 特点特点 MyISAM vs InnoDBMyISAM vs InnoDB •使用使用 Table SpaceTable Space 的方式来进行数据存储的方式来进行数据存储 ((ibdata1,ibdata1, ib_logfile0ib_logfile0)) • 支持 事务、外键约束等数据库特性支持 事务、外键约束等数据库特性 • Rows level lock ,Rows level lock , 读写性能都非常优秀读写性能都非常优秀 • 能够承载大数据量的存储和访问能够承载大数据量的存储和访问 • 拥有自己独立的缓冲池,能够缓存数据和索引拥有自己独立的缓冲池,能够缓存数据和索引 • 在关闭自动提交的情况下,与在关闭自动提交的情况下,与 MyISAMMyISAM 引擎速度差异不大引擎速度差异不大
  • 15. MyISAM vs InnoDBMyISAM vs InnoDB 性能测性能测 试试 数据量 / 单位 : 万 MyISAM InnoDB 备注 : my.cnf 特殊选项 插入: 1w 3 秒 219 秒 innodb_flush_log_at_trx_commit=1 插入: 10w 29 秒 2092 秒 innodb_flush_log_at_trx_commit=1 插入: 100w 287 秒 N/A innodb_flush_log_at_trx_commit=1 插入: 1w 3 秒 3 秒 innodb_flush_log_at_trx_commit=0 插入: 10w 30 秒 29 秒 innodb_flush_log_at_trx_commit=0 插入: 100w 273 秒 423 秒 innodb_flush_log_at_trx_commit=0 插入:插入: 1w1w N/AN/A 33 秒秒 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M 插入:插入: 10W10W N/AN/A 2626 秒秒 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M 插入:插入: 100W100W N/AN/A 379379 秒秒 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M
  • 16. 测试结果测试结果 MyISAM vs InnoDBMyISAM vs InnoDB 性能性能 测试测试 可以看出在 MySQL 5.0 里面, MyISAM 和 InnoDB 存储引擎性能差别 并不是很大,针对 InnoDB 来说,影响性能的主要是 innodb_flush_log_at_trx_commitinnodb_flush_log_at_trx_commit 这个选项,如果设置为这个选项,如果设置为 11 的话,那么的话,那么 每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷 新日志有关系,设置为新日志有关系,设置为 00 效率能够看到明显提升,当然,同样你可以效率能够看到明显提升,当然,同样你可以 SQLSQL 中提交“中提交“ SET AUTOCOMMIT = 0”SET AUTOCOMMIT = 0” 来设置达到好的性能。来设置达到好的性能。 同时也可以看出值得使用同时也可以看出值得使用 InnoDBInnoDB 来替代来替代 MyISAMMyISAM 引擎来进行开发引擎来进行开发 ,毕竟,毕竟 InnoDBInnoDB 有多数据库特性、更良好的数据存储性能和查询性能有多数据库特性、更良好的数据存储性能和查询性能
  • 19.  使用好的硬件,更快的硬盘、大内存、多核使用好的硬件,更快的硬盘、大内存、多核 CPUCPU ,专,专 业的存储服务器(业的存储服务器( NASNAS 、、 SANSAN ))  设计合理架构,如果设计合理架构,如果 MySQLMySQL 访问频繁,考虑访问频繁,考虑 Master/SlaveMaster/Slave 读写分离;数据库分表、数据库切片读写分离;数据库分表、数据库切片 (分布式),也考虑使用相应缓存服务帮助(分布式),也考虑使用相应缓存服务帮助 MySQLMySQL 缓解访问压力缓解访问压力 系统优化系统优化
  • 20.  配置合理的配置合理的 MySQLMySQL 服务器,尽量在应用本身达到一个服务器,尽量在应用本身达到一个 MySQLMySQL 最合理的使用最合理的使用  针对针对 MyISAMMyISAM 或或 InnoDBInnoDB 不同引擎进行不同定制性不同引擎进行不同定制性 配置配置  针对不同的应用情况进行合理配置针对不同的应用情况进行合理配置  针对针对 my.cnfmy.cnf 进行配置,后面设置是针对内存为进行配置,后面设置是针对内存为 2G2G 的的 服务器进行的合理设置服务器进行的合理设置 服务优化服务优化 MySQLMySQL 配置原则配置原则
  • 21. 服务优化服务优化 公共选项公共选项 选项 缺省值 推荐值 说明 max_connections 100 1024 MySQL 服务器同时处理的数据库连接的最大数量 query_cache_size 0 ( 不打开) 16M 查询缓存区的最大长度,按照当前需求,一倍一倍 增加,本选项比较重要 sort_buffer_size 512K 16M 每个线程的排序缓存大小,一般按照内存可以设置 为 2M 以上,推荐是 16M ,该选项对排序 order by , group by 起作用 record_buffer 128K 16M 每个进行一个顺序扫描的线程为其扫描的每张表分 配这个大小的一个缓冲区,可以设置为 2M 以上 table_cache 64 512 为所有线程打开表的数量。增加该值能增加 mysqld 要求的文件描述符的数量。 MySQL 对每个唯一打 开的表需要 2 个文件描述符。
  • 22. 服务优化服务优化 MyISAMMyISAM 选项选项 选项 缺省值 推荐值 说明 key_buffer_size 8M 256M 用来存放索引区块的缓存值 , 建议 128M 以 上,不要大于内存的 30% read_buffer_size 128K 16M 用来做 MyISAM 表全表扫描的缓冲大小 . 为从数据表顺序读取数据的读操作保留的缓 存区的长度 myisam_sort_buffer_si ze 16M 128M 设置 , 恢复 , 修改表的时候使用的缓冲大小 ,值不要设的太大
  • 23. 服务优化服务优化 InnoDBInnoDB 选项选项 选项 缺省值 推荐值 说明 innodb_buffer_pool_size 32M 1G InnoDB 使用一个缓冲池来保存索引和原始数据 , 这里你设置越大 , 你在存取表里面数据时所需要的 磁盘 I/O 越少,一般是内存的一半,不超过 2G , 否则系统会崩溃,这个参数非常重要 innodb_additional_mem_p ool_size 2M 128M InnoDB 用来保存 metadata 信息 , 如果内存是 4G ,最好本值超过 200M innodb_flush_log_at_trx_co mmit 1 0 0 代表日志只大约每秒写入日志文件并且日志文件刷新到 磁盘 ; 1 为执行完没执行一条 SQL 马上 commit; 2 代表日 志写入日志文件在每次提交后 , 但是日志文件只有大约每秒 才会刷新到磁盘上 . 对速度影响比较大,同时也关系数据 完整性 innodb_log_file_size 8M 256M 在日志组中每个日志文件的大小 , 一般是 innodb_buffer_pool_size 的 25% ,官方推荐是 innodb_buffer_pool_size 的 40-50%, 设置大一点 来避免在日志文件覆写上不必要的缓冲池刷新行为 innodb_log_buffer_size 128K 8M 用来缓冲日志数据的缓冲区的大小 . 推荐是 8M , 官方推荐该值小于 16M ,最好是 1M-8M 之间
  • 24.  设计合理的数据表结构:适当的数据冗余设计合理的数据表结构:适当的数据冗余  对数据表建立合适有效的数据库索引对数据表建立合适有效的数据库索引  数据查询:编写简洁高效的数据查询:编写简洁高效的 SQLSQL 语句语句 应用优化应用优化 应用优化方式应用优化方式
  • 25. 应用优化应用优化 表结构设计原则表结构设计原则  选择合适的数据类型:如果能够定长尽量定长选择合适的数据类型:如果能够定长尽量定长  不要使用无法加索引的类型作为关键字段,比如不要使用无法加索引的类型作为关键字段,比如 texttext 类型类型  为了避免联表查询,有时候可以适当的数据冗余,比为了避免联表查询,有时候可以适当的数据冗余,比 如如 邮箱、姓名这些不容易更改的数据邮箱、姓名这些不容易更改的数据  选择合适的表引擎,有时候选择合适的表引擎,有时候 MyISAMMyISAM 适合,有时候适合,有时候 InnoDBInnoDB 适合适合  为保证查询性能,最好每个表都建立有为保证查询性能,最好每个表都建立有 auto_incrementauto_increment 字段, 建立合适的数据库索引字段, 建立合适的数据库索引  最好给每个字段都设定最好给每个字段都设定 defaultdefault 值值
  • 26. 应用优化应用优化 索引建立原则索引建立原则  一般针对数据分散的关键字进行建立索引,比如一般针对数据分散的关键字进行建立索引,比如 IDID 、、 QQQQ ,, 像性别、状态值等等建立索引没有意义像性别、状态值等等建立索引没有意义  尽量使用短索引,一般对尽量使用短索引,一般对 intint 、、 char/varcharchar/varchar 、、 date/timedate/time 等等 类型的字段建立索引类型的字段建立索引  需要的时候建立联合索引,但是要注意查询需要的时候建立联合索引,但是要注意查询 SQLSQL 语句的语句的 编写编写  谨慎建立谨慎建立 uniqueunique 类型的索引(唯一索引)类型的索引(唯一索引)  一般建议每条记录最好有一个能快速定位的独一无二定一般建议每条记录最好有一个能快速定位的独一无二定 位的位的 唯一标示(索引)唯一标示(索引)  不要过度索引,单表建立的索引不要超过不要过度索引,单表建立的索引不要超过 55 个,否则更个,否则更 新索新索
  • 27. 应用优化应用优化 编写高效的编写高效的 SQLSQL  能够快速缩小结果集的能够快速缩小结果集的 WHEREWHERE 条件写在前面,如果有恒量条条件写在前面,如果有恒量条 件,件, 也尽量放在前面也尽量放在前面  尽量避免使用尽量避免使用 GROUP BYGROUP BY 、、 DISTINCTDISTINCT 、、 OROR 、、 ININ 等语句的使等语句的使 用,用, 避免使用联表查询和子查询,因为将使执行效率大大下降避免使用联表查询和子查询,因为将使执行效率大大下降  能够使用索引的字段尽量进行有效的合理排列,如果使用了能够使用索引的字段尽量进行有效的合理排列,如果使用了 联合索引,请注意提取字段的前后顺序联合索引,请注意提取字段的前后顺序  针对索引字段使用针对索引字段使用 >, >=, =, <, <=, IF NULL>, >=, =, <, <=, IF NULL 和和 BETWEENBETWEEN 将会使将会使 用用 索引, 如果对某个索引字段进行索引, 如果对某个索引字段进行 LIKELIKE 查询,使用查询,使用 LIKELIKE ‘%abc%’‘%abc%’ 不能使用索引,使用不能使用索引,使用 LIKE ‘abc%’LIKE ‘abc%’ 将能够使用索引将能够使用索引  如果在如果在 SQLSQL 里使用了里使用了 MySQLMySQL 部分自带函数,索引将失效,同时部分自带函数,索引将失效,同时 将无法将无法 使用使用 MySQLMySQL 的的 Query CacheQuery Cache ,比如,比如 LEFT(), SUBSTR(),LEFT(), SUBSTR(),
  • 29. MySQLMySQL 技巧分享技巧分享 常用技巧常用技巧  使用使用 Explain/ DESCExplain/ DESC 来分析来分析 SQLSQL 的执行情况的执行情况  使用使用 SHOW PROCESSLISTSHOW PROCESSLIST 来查看当前来查看当前 MySQLMySQL 服务器服务器 线程线程 执行情况,是否锁表,查看相应的执行情况,是否锁表,查看相应的 SQLSQL 语句语句  设置设置 my.cnfmy.cnf 中的中的 long-query-timelong-query-time 和和 log-slow-querieslog-slow-queries 能够能够 记录服务器那些记录服务器那些 SQLSQL 执行速度比较慢执行速度比较慢  另外有用的几个查询:另外有用的几个查询: SHOW VARIABLESSHOW VARIABLES 、、 SHOWSHOW STATUSSTATUS 、、 SHOW ENGINESSHOW ENGINES  使用使用 DESC TABLE xxxDESC TABLE xxx 来查看表结构,使用来查看表结构,使用 SHOWSHOW INDEXINDEX FROM xxxFROM xxx 来查看表索引来查看表索引  使用使用 LOAD DATALOAD DATA 导入数据比导入数据比 INSERT INTOINSERT INTO 快多了快多了  SELECT COUNT(*) FROM TblSELECT COUNT(*) FROM Tbl 在在 InnoDBInnoDB 中将会扫描中将会扫描 全表全表
  • 30. MySQLMySQL 技巧分享技巧分享 ExplainExplain 使用使用  语法:语法: EXPLAIN SELECTEXPLAIN SELECT select_optionsselect_options Type:Type: 类型,是否使用了索引还是全表扫描类型,是否使用了索引还是全表扫描 , const,eg_reg,ref,range,index,ALL, const,eg_reg,ref,range,index,ALL Key:Key: 实际使用上的索引是哪个字段实际使用上的索引是哪个字段 Ken_len:Ken_len: 真正使用了哪些索引,不为真正使用了哪些索引,不为 NULLNULL 的就是真实使用的索引的就是真实使用的索引 Ref:Ref: 显示了哪些字段或者常量被用来和显示了哪些字段或者常量被用来和 keykey 配合从表中查询记录出来配合从表中查询记录出来 Rows:Rows: 显示了显示了 MySQLMySQL 认为在查询中应该检索的记录数认为在查询中应该检索的记录数 Extra:Extra: 显示了查询中显示了查询中 MySQLMySQL 的附加信息,关心的附加信息,关心 Using filesortUsing filesort 和和 Using temporaryUsing temporary ,性能杀,性能杀 手手
  • 33. MySQLMySQL 技巧分享技巧分享 使用使用 UNIONUNION 来取代来取代 ININ 和和 OROR 原原 SQLSQL :: select * from city where id in (1,3,4)select * from city where id in (1,3,4) 或或 select * from city where id = 1 or id = 3 or id = 4select * from city where id = 1 or id = 3 or id = 4 explainexplain 结果:结果: id select_type table type possible_keys key key_len ref rows Extraid select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE city ALL PRIMARY NULL NULL NULL1 SIMPLE city ALL PRIMARY NULL NULL NULL 5 Using where5 Using where 修改后修改后 SQLSQL :: SELECT * FROM city where id = 1SELECT * FROM city where id = 1 UNION ALL SELECT * FROM city where id = 3UNION ALL SELECT * FROM city where id = 3 UNION ALL SELECT * FROM cityUNION ALL SELECT * FROM city explainexplain 结果:结果: id select_type table type possible_keys key key_len ref rows Extraid select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY city const PRIMARY PRIMARY 41 PRIMARY city const PRIMARY PRIMARY 4 const 1const 1 2 UNION city const PRIMARY PRIMARY 42 UNION city const PRIMARY PRIMARY 4 const 1const 1 3 UNION city const PRIMARY PRIMARY 43 UNION city const PRIMARY PRIMARY 4 const 1const 1 NULL UNION RESULT <union1,2,3> ALL NULL NULL NULL NULL NULLNULL UNION RESULT <union1,2,3> ALL NULL NULL NULL NULL NULL
  • 34. MySQLMySQL 技巧分享技巧分享 MySQL Slow LogMySQL Slow Log 分析工具分析工具  mysqldumpslow - mysqlmysqldumpslow - mysql 官方提供的慢查询日志分析工具官方提供的慢查询日志分析工具  mysqlsla - hackmysql.commysqlsla - hackmysql.com 推出的一款日志分析工具,功能推出的一款日志分析工具,功能 非常强大非常强大  mysql-explain-slow-logmysql-explain-slow-log –– 德国工程师使用德国工程师使用 PerlPerl 开发的把开发的把 SlowSlow LogLog 输出到屏幕,功能简单输出到屏幕,功能简单  mysql-log-filter - Google codemysql-log-filter - Google code 上一个开源产品,报表简洁上一个开源产品,报表简洁  myprofi -myprofi - 纯纯 PHPPHP 开发的开源开发的开源 loglog 查看工具,功能详细查看工具,功能详细
  • 35. MySQLMySQL 技巧分享技巧分享 MySQLMySQL 优化网站优化网站 // 书籍分享书籍分享  MySQL Performance BlogMySQL Performance Blog  MySQLMySQL 中文网中文网 《《 MySQLMySQL 性能调优与架构设计性能调优与架构设计 》》 《《深入浅出深入浅出 MySQLMySQL 》》
  • 36. Q & AQ & A