`
wangdei
  • 浏览: 372910 次
社区版块
存档分类
最新评论

MySQL数据库优化

阅读更多

1:如果你在一个数据库中创建大量的表,那么执行打开,关闭,创建(表)的操作就会很慢.

2:mysql使用内存

  a: 关键字缓存区(key_buffer_size)由所有线程共享

  b: 每个连接使用一些特定的线程空间.一个栈(默认为64k,变量thread_stack),一个连接缓冲区(变量net_buffer_length)和一个结果缓冲区(net_buffer_length).特定情况下,连接缓冲区和结果缓冲区被动态扩大到max_allowed_packet.

  c:所有线程共享一个基存储器

  d:没有内存影射

  e:每个做顺序扫描的请求分配一个读缓冲区(record_buffer)

  f:所有联结均有一遍完成并且大多数联结甚至可以不用一个临时表完成.最临时的表是基于内存的(heap)表

  g:排序请求分配一个排序缓冲区和2个临时表

  h:所有语法分析和计算都在一个本地存储器完成

  i:每个索引文件只被打开一次,并且数据文件为每个并发运行的线程打开一次

  j:对每个blob列的表,一个缓冲区动态的被扩大以便读入blob值

  k:所有正在使用的表的表处理器被保存在一个缓冲器中并且作为一个fifo管理.

  l:一个mysqladmin flush-tables命令关闭所有不在使用的表并且在当前执行的线程结束时标记所有在使用的表准备关闭

3:mysql锁定表

  mysql中所有锁定不会成为死锁. wirte锁定: mysql的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入写锁定队列中

  read锁定: mysql的锁定原理:a:如果表没有锁定,那么锁定;b否则,把锁定请求放入读锁定队列中

  有时候会在一个表中进行很多的select,insert操作,可以在一个临时表中插入行并且偶尔用临时表的记录更新真正的表

  a:用low_priority属性给一个特定的insert,update或者delete较低的优先级

  b:max_write_lock_count指定一个值(通常很小)来启动mysqld,使得在一定数量的write锁定之后出现read锁定

  c:通过使用set sql_low_priority_updates=1可以从一个特定的线程指定所有的更改应该由较低的优先级完成

  d:用high_priority指定一个select

  e:如果使用insert....select....出现问题,使用myisam表------因为它支持因为它支持并发的select和insert

4:最基本的优化是使数据在硬盘上占据的空间最小.如果索引做在最小的列上,那么索引也最小.实现方法:

  a:使用尽可能小的数据类型

  b:如果可能,声明表列为NOT NULL.

  c:如果有可能使用变成的数据类型,如varchar(但是速度会受一定的影响)

  d:每个表应该有尽可能短的主索引 e:创建确实需要的索引

  f:如果一个索引在头几个字符上有唯一的前缀,那么仅仅索引这个前缀----mysql支持在一个字符列的一部分上的索引

  g:如果一个表经常被扫描,那么试图拆分它为更多的表

1:索引的使用.

  索引的重要性就不说了,功能也不说了,只说怎么做. 首先要明确所有的mysql索引(primary,unique,index)在b树中有存储.索引主要用语:

  a:快速找到where指定条件的记录

  b:执行联结时,从其他表检索行

  c:对特定的索引列找出max()和min()值

  d:如果排序或者分组在一个可用键的最前面加前缀,排序或分组一个表

  e:一个查询可能被用来优化检索值,而不用访问数据文件.如果某些表的列是数字型并且正好是某个列的前缀,为了更快,值可以从索引树中取出

2:或者更新数据的查询速度  grant的执行会稍稍的减低效率.

  mysql的函数应该被高度的优化.可以用benchmark(loop_count,expression)来找出是否查询有问题

  select的查询速度:如果想要让一个select...where...更快,我能想到的只有建立索引.可以在一个表上运行myisamchk--analyze来更好的优化查询.可以用myisamchk--sort-index--sort-records=1来设置用一个索引排序一个索引和数据.

3:sql优化where子句

  3.1:删除不必要的括号:

  ((a AND b) AND c OR (((a AND b) AND (a AND d))))>(a AND b AND c) OR (a AND b AND c AND d)

  3.2:使用常数

  (a b>5 AND b=c AND a=5

  3.3:删除常数条件

  (b>=5 AND b=5) OR (b=6 AND 5=5) OR (b=100 AND 2=3) > b=5 OR b=6

  3.4:索引使用的常数表达式仅计算一次

  3.5:在一个表中,没有一个where的count(*)直接从表中检索信息

  3.6:所有常数的表在查询中在任何其他表之前读出

  3.7:对外联结表最好联结组合是尝试了所有可能性找到的

  3.8:如果有一个order by字句和一个不同的group by子句或者order by或者group by包含不是来自联结的第一个表的列,那么创建一个临时表

  3.9:如果使用了sql_small_result,那么msyql使用在内存中的一个表

  3.10:每个表的索引给查询并且使用跨越少于30%的行的索引.

  3.11在每个记录输出前,跳过不匹配having子句的行

4:优化left join

  在mysql中 a left join b按以下方式实现

  a:表b依赖于表a 
 
  b:表a依赖于所有用在left join条件的表(除了b)

  c:所有left join条件被移到where子句中

  d:进行所有的联结优化,除了一个表总是在所有他依赖的表后读取.如果有一个循环依赖,那么将发生错误

  e:进行所有的标准的where优化
  
  f:如果在a中有一行匹配where子句,但是在b中没有任何匹配left join条件,那么,在b中生成的所有设置为NULL的一行

  g:如果使用left join来找出某些表中不存在的行并且在where部分有column_name IS NULL测试(column_name为NOT NULL列).那么,mysql在它已经找到了匹配left join条件的一行后,将停止在更多的行后寻找

5:优化limit

  a:如果用limit只选择一行,当mysql需要扫描整个表时,它的作用相当于索引

  b:如果使用limit#与order by,mysql如果找到了第#行,将结束排序,而不会排序正个表

  c:当结合limit#和distinct时,mysql如果找到了第#行,将停止

  d:只要mysql已经发送了第一个#行到客户,mysql将放弃查询

  e:limit 0一直会很快的返回一个空集合.

  f:临时表的大小使用limit#计算需要多少空间来解决查询

6:优化insert

  插入一条记录的是由以下构成:

  a:连接(3)

  b:发送查询给服务器(2)

  c:分析查询(2)

  d:插入记录(1*记录大小)

  e:插入索引(1*索引)

  f:关闭(1)

  以上数字可以看成和总时间成比例

7:改善插入速度的一些方法:

  7.1:如果同时从一个连接插入许多行,使用多个值的insert,这比用多个语句要快

  7.2:如果从不同连接插入很多行,使用insert delayed语句速度更快

  7.3: 用myisam,如果在表中没有删除的行,能在select:s正在运行的同时插入行

  7.4: 当从一个文本文件装载一个表时,用load data infile.这个通常比insert快20 倍

  7.5:可以锁定表然后插入--主要的速度差别是在所有insert语句完成后,索引缓冲区仅被存入到硬盘一次.一般与有不同的insert语句那样多次存入要快.如果能用一个单个语句插入所有的行,锁定就不需要.锁定也降低连接的整体时间.但是对某些线程最大等待时间将上升.例如:

  thread 1 does 1000 inserts
  thread 2,3 and 4 does 1 insert
  thread 5 does 1000 inserts

  如果不使用锁定,2,3,4,将在1和5之前完成.如果使用锁定,2,3,4,将可能在1和5之后完成.但是整体时间应该快40%.因为insert,update,delete操作在mysql中是很快的,通过为多于大约5次连续不断的插入或更新一行的东西加锁,将获得更好的整体性能.如果做很多一行的插入,可以做一个lock tables,偶尔随后做一个unlock tables(大约每1000行)以允许另外的线程存取表.这仍然将导致获得好的性能.load data infile对装载数据仍然是很快的.

  为了对load data infile和insert得到一些更快的速度,扩大关键字缓冲区.

8:优化update的速度

  它的速度依赖于被更新数据的大小和被更新索引的数量

  使update更快的另一个方法是推迟修改,然后一行一行的做很多修改.如果锁定表,做一行一行的很多修改比一次做一个快

9:优化delete速度

  删除一个记录的时间与索引数量成正比.为了更快的删除记录,可以增加索引缓存的大小 从一个表删除所有行比删除这个表的大部分要快的多

 

第四步:选择一种表类型


1.1静态myisam


  这种格式是最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态myisam文件时导致计算机down掉,myisamchk很容易指出每行在哪里开始和结束,因此,它通常能收回所有记录,除了部分被写入的记录.在mysql中所有索引总能被重建

1.2动态myisam

  这种格式每一行必须有一个头说明它有多长.当一个记录在更改期间变长时,它可以在多于一个位置上结束.能使用optimize tablename或myisamchk整理一张表.如果在同一个表中有像某些varchar或者blob列那样存取/改变的静态数据,将动态列移入另外一个表以避免碎片.

  1.2.1压缩myisam,用可选的myisampack工具生成

  1.2.2内存

  这种格式对小型/中型表很有用.对拷贝/创建一个常用的查找表到洋heap表有可能加快多个表联结,用同样数据可能要快好几倍时间.

  select tablename.a,tablename2.a from tablename,tablanem2,tablename3 where

  tablaneme.a=tablename2.a and tablename2.a=tablename3.a and tablename2.c!=0;

  为了加速它,可以用tablename2和tablename3的联结创建一个临时表,因为用相同列(tablename1.a)查找.

  CREATE  TEMPORARY  TABLE test TYPE=HEAP
  SELECT
  tablename2.a as a2,tablename3.a as a3
  FROM
  tablenam2,tablename3
  WHERE
  tablename2.a=tablename3.a and c=0;
  SELECT tablename.a,test.a3 from tablename,test where tablename.a=test.a1;
  SELECT tablename.a,test,a3,from tablename,test where tablename.a=test.a1 and ....;

1.3静态表的特点

  1.3.1默认格式.用在表不包含varchar,blob,text列的时候

  1.3.2所有的char,numeric和decimal列填充到列宽度

  1.3.3非常快
  
  1.3.4容易缓冲

  1.3.5容易在down后重建,因为记录位于固定的位置

  1.3.6不必被重新组织(用myisamchk),除非是一个巨量的记录被删除并且优化存储大小

  1.3.7通常比动态表需要更多的存储空间

1.4动态表的特点

  1.4.1如果表包含任何varchar,blob,text列,使用该格式

  1.4.2所有字符串列是动态的

  1.4.3每个记录前置一个位

  1.4.4通常比定长表需要更多的磁盘空间

  1.4.5每个记录仅仅使用所需要的空间,如果一个记录变的很大,它按需要被分成很多段,这导致了记录碎片

  1.4.6如果用超过行长度的信息更新行,行被分段

  1.4.7在系统down掉以后不好重建表,因为一个记录可以是多段

  1.4.8对动态尺寸记录的期望行长度是 3+(number of columns +7)/8+(number of char columns)+packed size of numeric columns+length of strings +(number of NULL columns+7)/8

  对每个连接有6个字节的惩罚.无论何时更改引起记录的变大,都有一个动态记录被连接.每个新连接至少有20个字节,因此下一个变大将可能在同一个连接中.如果不是,将有另外一个连接.可以用myisamchk -恶毒检查有多少连接.所有连接可以用myisamchk -r删除.

1.5压缩表的特点

  1.5.1一张用myisampack实用程序制作的只读表

  1.5.2解压缩代码存在于所有mysql分发中,以便使没有myisampack的连接也能读取用myisampack压缩的表

  1.5.3占据很小的磁盘空间

  1.5.4每个记录被单独压缩.一个记录的头是一个定长的(1~~3个字节)这取决于表的最大记录.每列以不同的方式被压缩.一些常用的压缩类型是:

  a:通常对每列有一张不同的哈夫曼表  

  b:后缀空白压缩  

  c:前缀空白压缩

  d:用值0的数字使用1位存储

  e:如果整数列的值有一个小范围,列使用最小的可能类型来存储.例如:如果所有的值在0到255之间,一个bigint可以作为一个tinyint存储

  f:如果列仅有可能值的一个小集合,列类型被转换到enum  

  g:列可以使用上面的压缩方法的组合

  1.5.5能处理定长或动态长度的记录,去不能处理blob或者text列 1.5.6能用myisamchk解压缩

  mysql能支持不同的索引类型,但一般的类型是isam,这是一个B树索引并且能粗略的为索引文件计算大小为(key_length+4)*0.67,在所有的键上的总和.

  字符串索引是空白压缩的。如果第一个索引是一个字符串,它可将压缩前缀如果字符串列有很多尾部空白或是一个总部能甬道全长的varchar列,空白压缩使索引文件更小.如果很多字符串有相同的前缀.

1.6内存表的特点

  mysql内部的heap表使用每偶溢出去的100%动态哈希并且没有与删除有关的问题.只能通过使用在堆表中的一个索引来用等式存取东西(通常用'='操作符)

  堆表的缺点是:

  1.6.1想要同时使用的所有堆表需要足够的额外内存

  1.6.2不能在索引的一个部分搜索

  1.6.3不能按顺序搜索下一个条目(即,使用这个索引做一个order by)

  1.6.4mysql不能算出在2个值之间大概有多少行.这被优化器使用是用来决定使用哪个索引的,但是在另一个方面甚至不需要磁盘寻道


【完】

分享到:
评论
1 楼 bnmcvzx 2008-08-29  

相关推荐

    mysql数据库优化的学习心得

    MySQL 数据库优化技巧总结 MySQL 数据库优化是数据库管理和开发者非常关心的一个问题。由于 MySQL 数据库的性能优化可以直接影响到整个应用系统的性能和用户体验,因此掌握 MySQL 数据库优化技巧对开发者和数据库...

    MySQL数据库优化SQL篇PPT课件.pptx

    MySQL数据库优化SQL篇PPT课件.pptx 本PPT课件主要讲述了MySQL数据库优化的重要知识点,特别是SQL优化方面的内容。从执行计划、SELECT语句、IN和EXIST语句、LIMIT语句、RAND函数、Order by、Group by、Distinct和...

    mysql数据库优化方案(值得学习)

    简单描述数据库优化方案,以及数据库一些常用的操作,包括一些简单的查询语句,函数使用,合适学习mysql的读者。 简单描述数据库优化方案,以及数据库一些常用的操作,包括一些简单的查询语句,函数使用,合适学习...

    MySQL数据库优化实践

    MySQL数据库优化实践主要涵盖硬件配置、操作系统层面的调整以及文件系统的优化等方面,这些优化措施能够显著提高MySQL数据库的性能和响应速度。 首先,硬件优化是基础。开启BBWC(Battery Backed Write Cache)能...

    MySQL数据库优化方案及应用

    MySQL数据库优化方案及应用主要关注的是提升数据库性能和系统稳定性,以应对高并发访问场景。在本文中,我们将深入探讨数据库优化的各种策略和技术,以及如何通过Amoeba for MySQL中间层代理和分布式数据库架构实现...

    MYSQL数据库优化秘籍

    MYSQL数据库优化秘籍,大牛出的,值得你反复研读 MySQL在Linux环境下的安装 文件引擎MyISAM与InnoDB比较 LOAD DATA INFILE/mysqldump DBA的分析命令 MySQL的系统配置参数、诊断操作系统的状态 MySQL的分库分表,分区...

    MySQL数据库优化SQL篇.ppt

    MySQL数据库优化SQL篇.ppt,适用于企业级项目开发

    MySQL数据库优化SQL篇PPT学习教案.pptx

    MySQL数据库优化SQL篇学习教案 MySQL数据库优化SQL篇学习教案旨在帮助读者学习和掌握 MySQL 数据库优化的相关知识,涵盖了 SELECT 语句优化、执行计划、IN 和 EXISTS 语句、LIMIT 语句、RAND 函数、Order、Group、...

    Mysql数据库优化总结

    Mysql数据库优化总结-飞鸿无痕-ChinaUnix博客................................................................................................................

    mysql数据库优化

    MySQL数据库优化主要包括以下几个知识点: 1. MySQL在Linux环境下的安装方式:包括rpm安装和源码安装。rpm安装的优点是安装速度快,时间短,便利,但可能没有包含所有需要的功能。源码安装的优点是可用性大,可以...

    MySQL数据库优化攻略

    MySQL数据库优化攻略涉及的知识点繁多,主要包括以下几个方面: 1. 优化目的:数据库优化的主要目的是提升数据库的稳定性和效率,减少应用响应时间,提升用户体验,避免页面访问错误。这意味着优化工作不仅仅是为了...

    一种深入解决MySQL数据库优化方案.pdf

    本文将深入探讨MySQL数据库优化的各种策略和方法。 1. **选择MySQL的意义** MySQL因其灵活的存储引擎架构、高性能、低资源消耗和广泛的语言支持而成为企业首选的数据库系统。然而,随着业务的发展,如高并发连接、...

    Mysql数据库优化学习笔记

    MySQL数据库优化学习笔记 在数据库管理系统中,MySQL是一款广泛应用的关系型数据库,因其开源、免费、高效的特点,被广泛用于各种规模的项目。然而,随着数据量的增长和业务复杂度的提高,性能优化变得至关重要。本...

    mysql数据库优化文档

    mysql数据库优化文档,有喜欢的童鞋可以看一下

    mysql数据库优化视频教程

    mysql数据库优化视频教程,文件内含百度云下载链接,请自行下载观看,链接失效时可联系邮箱补发,谢谢,赶快下载吧,即下即用~

Global site tag (gtag.js) - Google Analytics