mySQLOptimization - juedaiyuer/researchNote GitHub Wiki

#SQL优化#

#查看服务器状态信息
#global 自数据库启动至今的统计结果
show [session|global] status

#当前session中所有统计参数的值
#作用于所有存储引擎
#com_select 执行select操作的次数
#com_insert 对于批量插入,只累加一次
#com_update com_delete

show status like 'com_%';

#只针对Innodb存储引擎
show status like 'innodb_rows_%';

| Innodb_rows_deleted  | 0     |
| Innodb_rows_inserted | 4     |
| Innodb_rows_read     | 20    |
| Innodb_rows_updated  | 0     |

#试图连接MySQL服务器的次数
connections

#服务器工作时间
uptime

#慢查询的次数
slow_queries

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

#慢查询日志,在查询结束后才记录
--log-slow-queries[=file_name]

#实时查看
show processlist

##通过explain分析##

表的全表扫描导致效率的不理想,创建索引

##索引问题##

MyISAM存储引擎的表的数据和索引是自动分开存储的

InnoDB存储引擎的数据和索引存储在同一个表空间里面,但是也可以设定分开存储

###使用索引###

索引的前缀特性

复合索引时,可以匹配索引的最左侧,如果where条件使用复合索引的最右侧,索引不会被用到

使用like的查询,%放于首位索引不会被使用

like后面跟着一个列的名字,索引也不会被使用

如果对大的文本进行搜索,使用全文索引而不用使用like '%...%'

如果列名是索引,使用col_name is null将使用索引

###存在索引但不使用索引###

#如果使用索引比全表扫描更慢,则不使用索引
#譬如一个列均与分布在某一个区间[m,n]
select * from tb_name where key_part >m and key_part < n;


#如果使用memory/heap表并且where条件中不使用=进行索引,则不使用索引

#用or分割开的条件,前面列有索引,后面列没有索引,则不使用索引

#如果列类型时字符串,where条件中把字符常量值用引号,否则不使用索引

###查看索引使用情况###

mysql> show status like 'Handler_read%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 8     |
| Handler_read_key      | 16    |
| Handler_read_last     | 0     |
| Handler_read_next     | 0     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 4     |
| Handler_read_rnd_next | 110   |
+-----------------------+-------+
7 rows in set (0.00 sec)

Handler_read_key:索引正在工作的数值

Handler_read_rnd_next:如果进行大量的表扫描,数值会很高

##两个简单使用的优化方法##

##source##

  • MySQL数据库开发,优化与管理维护(PDF:242.18章)