怎么用mysql优化 mysql如何做优化( 三 )


4、事务
尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的 。更多的时候是需要用到一系列的语句来完成某种工作 。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来 。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整 , 甚至会破坏数据库中的数据 。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功 , 要么都失败
5、锁定表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能 , 尤其是在很大的应用系统中 。由于在事务执行的过程中 , 数据库将会被锁定 , 因此其它的用户请求只能暂时等待直到该事务结束 。其实,有些情况下我们可以通过锁定表的方法来获得更好的性能 。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性 。这个时候我们就可以使用外键 。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显 。
8、优化的查询语句
绝大多数情况下 , 使用索引可以提高查询的速度 , 但如果SQL语句使用不恰当的话 , 索引将无法发挥它应有的作用 。
MySQL常用优化方案语句执行后 , 会显示三个字段: Query_ID(执行ID) | Duration(持续时间)| Query(查询语句) ;
拿到后Query_ID后,可执行 show profile for query Query_ID ,查看详细的准备时间,执行时间、执行结束( preparing、executing、end )等 。
显示用户正在运行的线程,需要注意的是 , 除了 root 用户能看到所有正在运行的线程外 , 其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程 。除非单独个这个用户赋予了PROCESS 权限 。
显示字段包含: User| Host| db | Command | Time| State| Info 等 。
解析语句,查询是否命中索引,及,命中何种索引,用以判断是否符合我们的预期 。
返回字段包含: select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra等 。
select_type常见类型:
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分 , 最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
table常见类型:
显示这一行的数据是关于哪张表的.
有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果)
type常见类型:
对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型” 。
常用的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL (从左到右,性能从差到好)
possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出 , 但不一定被查询使用(该查询可以利用的索引 , 如果没有任何索引显示 null)

推荐阅读