SQL优化



优化SQL的一般步骤:



通过show status 了解各种sql的执行效率



以下几个参数对 Myisam 和 Innodb 存储引擎都计数:



1. Com_select 执行 select 操作的次数,一次查询只累加 1;



2. Com_insert 执行 insert 操作的次数,对于批量插入的 insert 操作,只累加一次 ;



3. Com_update 执行 update 操作的次数;



4. Com_delete 执行 delete 操作的次数;





以下几个参数是针对 Innodb 存储引擎计数的,累加的算法也略有不同:



1. Innodb_rows_read select 查询返回的行数;



2. Innodb_rows_inserted执行 Insert 操作插入的行数;



3. Innodb_rows_updated 执行 update 操作更新的行数;



4. Innodb_rows_deleted 执行 delete 操作删除的行数;





通过以上几个参数,可以很容易的了解当前数据库的应用是以插入更新为主还是



以查询操作为主,以及各种类型的 SQL 大致的执行比例是多少。对于更新操作的计 数 ,



是对执行次数的计数,不论提交还是回滚都会累加。



对于事务型的应用,通过 Com_commit 和 Com_rollback 可以了解事务提交和回滚



的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。





以下参数便于我们了解数据库的基本情况



1、Connections 试图连接mysql服务器的次数



2、Uptime 服务器工作时间



3、Slow_queries 慢查询的次数




定位执行效率较低的SQL语句




1 通过慢查询日志定位效率低的sql语句 --log-show-queies


2 show processlist 查看当前线程状态和锁状况



通过explain分析低效SQL的执行计划



select_type: select 类型


table: 输出结果集的表


type: 表示表的连接类型


当表中仅有一行是type的值为system是最佳的连接类型;


当select操作中使用索引进行表连接时type的值为ref;


当select的表连接没有使用索引时,经常会看到type的值为ALL,表示对该表


进行了全表扫描,这时需要考虑通过创建索引来提高表连接的效率。


possible_keys: 表示查询时,可以使用的索引列.


key: 表示使用的索引


key_len: 索引长度


rows: 扫描范围


Extra: 执行情况的说明和描述



mysql 避免更新update time mysql频繁更新优化_回滚



确定问题并采取相应的措施



一般是索引的问题




索引问题




索引基础知识





组成 myisam索引和数据分开 innodb是放在一个空间,但是由多个文件组成索引的分类: btree和hashmyisam和innodb 只支持btreememory和heap支持hash和btree





索引的使用





1 索引支持左前缀索引



2 like 不能以 % 开始



3 大文本搜索不能使用 %% ,可以用全文搜索





索引无法使用的情况





1 mysql估计使用索引比全表扫描更慢,则不适用索引



2 like 以 % 开始



3 使用 or or不是所有列都有索引



4 不是索引列的一部分



5 如果列类型是字符串,一定把where中的字符串引起来





查看索引的使用情况





show status like 'Handler_read%';



Handler_read_key 代表索引值被读的次数,很低代表索引得到的性能改善不高,索引不是经常使用




mysql 避免更新update time mysql频繁更新优化_数据库_02



两种简单实用的优化方法





定期分析 : check / analyze table



定期优化: optimize table





大批量插入数据





对应myisam引擎,大批数据插入,关闭非唯一索引的更新 alter table xxx disable keys load data file xxx alter table xxx enable keysinnodb提高导入效率 导入的数据按照主键顺序排列 关闭唯一校验,set unique_checks=0,set unique_checks=1然后打开 关闭自动提交 set autocommit=0,set autocommit=1





优化insert语句





1 同一客户端插入,考虑批量插入



delayed,表明立即执行insert



3 索引文件和数据文件分在不同的磁盘存放



4 从文件到表 采用 load data insert





优化order by 语句





使用索引来满足order by语句,如果与索引顺序一致,且order by的字段都是升序降序





优化or 语句





or的每个条件列需要加索引





优化 join 语句





使用join代替子查询