您当前位置: 圣才学习网首页 >> IT类 >> MySQL专题

MySQL数据库优化入门教程(3)

扫码手机阅读
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
评论(0
   
来源:网络 作者:未知
 
  第四步
 
  1:索引的使用,索引的重要性就不说了,功能也不说了,只说怎么做. 首先要明确所有的mysql索引(primaryuniqueindex)在b树中有存储.索引主要用语:
 
  a:快速找到where指定条件的记录 b:执行联结时,从其他表检索行 c:对特定的索引列找出max()和min()值
 
  d:如果排序或者分组在一个可用键的最前面加前缀,排序或分组一个表
 
  e:一个查询可能被用来优化检索值,而不用访问数据文件.如果某些表的列是数字型并且正好是某个列的前缀,为了更快,值可以从索引树中取出
 
  2:存储或者更新数据的查询速度  grant的执行会稍稍的减低效率.
 
  mysql的函数应该被高度的优化.可以用benchmarkloop_countexpression)来找出是否查询有问题
 
  select的查询速度:如果想要让一个select...where...更快,我能想到的只有建立索引.可以在一个表上运行myisamchk--analyze来更好的优化查询.可以用myisamchk--sort-index--sort-records=1来设置用一个索引排序一个索引和数据.
 
  3:mysql优化where子句
 
  3.:删除不必要的括号:
 
  ((
 
  (a AND b AND c OR a AND b AND c AND d
 
  3.2:使用常数
 
  (ab>5 AND bc AND a5
 
  3.3:删除常数条件
 
  (b>
 
  b5 OR b6
 
  3.4:索引使用的常数表达式仅计算一次
 
  3.5:在一个表中,没有一个wherecount*)直接从表中检索信息
 
  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_nameNOT NULL列).那么,mysql在它已经找到了匹配left join条件的一行后,将停止在更多的行后寻找
 
  5:优化limit
 
  a:如果用limit只选择一行,当mysql需要扫描整个表时,它的作用相当于索引
 
  b:如果使用limit#与order bymysql如果找到了第#行,将结束排序,而不会排序正个表
 
  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)
 
  以上数字可以看成和总时间成比例
 
  改善插入速度的一些方法:
 
  6.1:如果同时从一个连接插入许多行,使用多个值的insert,这比用多个语句要快
 
  6.2:如果从不同连接插入很多行,使用insert delayed语句速度更快
 
  6.3: myisam,如果在表中没有删除的行,能在select:s正在运行的同时插入行
 
  6.4: 当从一个文本文件装载一个表时,用load data infile.这个通常比insert20
 
  6.5:可以锁定表然后插入--主要的速度差别是在所有insert语句完成后,索引缓冲区仅被存入到硬盘一次.一般与有不同的insert语句那样多次存入要快.如果能用一个单个语句插入所有的行,锁定就不需要.锁定也降低连接的整体时间.但是对某些线程最大等待时间将上升.例如:
 
  thread 1 does 1000 inserts
 
  thread 23 and 4 does 1 insert
 
  thread 5 does 1000 inserts
 
  如果不使用锁定,2,3,4将在1和5之前完成.如果使用锁定,2,3,4,将可能在1和5之后完成.但是整体时间应该快40%.因为insertupdatedelete操作在mysql中是很快的,通过为多于大约5次连续不断的插入或更新一行的东西加锁,将获得更好的整体性能.如果做很多一行的插入,可以做一个lock tables,偶尔随后做一个unlock tables(大约每1000行)以允许另外的线程存取表.这仍然将导致获得好的性能.load data infile对装载数据仍然是很快的.
 
  为了对load data infileinsert得到一些更快的速度,扩大关键字缓冲区.
 
  7优化update的速度
 
  它的速度依赖于被更新数据的大小和被更新索引的数量
 
  使update更快的另一个方法是推迟修改,然后一行一行的做很多修改.如果锁定表,做一行一行的很多修改比一次做一个快
 
  8优化delete速度
 
删除一个记录的时间与索引数量成正比.为了更快的删除记录,可以增加索引缓存的大小从一个表删除所有行比删除这个表的大部分要快的多
 
相关阅读
 
 

小编工资已与此挂钩!一一分钱!求打赏↓ ↓ ↓

如果你喜欢本文章,请赐赏:

已赐赏的人
最新评论(共0条)评论一句