mysql之优化篇(一)

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: 执行情况的说明和描述


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

一般是索引的问题

索引问题

索引基础知识

组成 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 代表索引值被读的次数,很低代表索引得到的性能改善不高,索引不是经常使用



两种简单实用的优化方法

定期分析 : 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 同一客户端插入,考虑批量插入
2 不同的客户端插入多行,可以 insert delayed,表明立即执行insert
3 索引文件和数据文件分在不同的磁盘存放
4 从文件到表 采用 load data insert

优化order by 语句

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

优化or 语句
or的每个条件列需要加索引

优化 join 语句

使用join代替子查询


猜你喜欢

转载自blog.csdn.net/u011028179/article/details/79625595
今日推荐