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章)