当前位置:数据库 > MySQL >>

优化MySQL数据库查询

优化MySQL数据库查询
最简单且最安全的格式,它是磁盘格式中最快的.速度来自于数据能在磁盘上被找到的难易程度.当锁定有一个索引和静态格式的东西是,它很简单,只是行长度乘以数量.而且在扫描一张表时,每次用磁盘读取来读入常数个记录是很容易的.安全性来源于如果当写入一个静态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存储
  
  g:如果列仅有可能值的一个小集合,列类型被转换到enum  h:列可以使用上面的压缩方法的组合
  
  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)

:内存的限制.当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈---不过现在内存大的惊人,一般不会出现这个问题.
  
  第二步: (本人使用的是学校网站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk ))
  
  1:调节服务器参数
  
  用shell>mysqld-help这个命令声厂一张所有mysql选项和可配置变量的表.输出以下信息:
  
  possible variables for option--set-variable(-o) are:
  
  back_log current value:5 //要求mysql能有的连接数量.back_log指出在mysql暂停接受连接的时间内有多少个连接请求可以被存在堆栈中
  
  connect_timeout current value:5 //mysql服务器在用bad handshake(不好翻译)应答前等待一个连接的时间
  
  delayed_insert_timeout current value:200 //一个insert delayed在终止前等待insert的时间
  
  delayed_insert_limit current value:50 //insert delayed处理器将检查是否有任何select语句未执行,如果有,继续前执行这些语句
  
  delayed_queue_size current value:1000 //为insert delayed分配多大的队
  
  flush_time current value:0 //如果被设置为非0,那么每个flush_time 时间,所有表都被关闭
  
  interactive_timeout current value:28800 //服务器在关上它之前在洋交互连接上等待的时间
  
  join_buffer_size current value:131072 //用与全部连接的缓冲区大小
  
  key_buffer_size current value:1048540 //用语索引块的缓冲区的大小,增加它可以更好的处理索引
  
  lower_case_table_names current value:0 //
  
  long_query_time current value:10 //如果一个查询所用时间大于此时间,slow_queried计数将增加
  
  max_allowed_packet current value:1048576 //一个包的大小
  
  max_connections current value:300 //允许同时连接的数量
  
  max_connect_errors current value:10 //如果有多于该数量的中断连接,将阻止进一步的连接,可以用flush hosts来解决
  
  max_delayed_threads current value:15 //可以启动的处理insert delayed的数量
  
  max_heap_table_size current value:16777216 //
  
  max_join_size current value:4294967295 //允许读取的连接的数量
  
  max_sort_length current value:1024 //在排序blob或者text时

补充:数据库,mysql教程
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,