mysql优化:
https://segmentfault.com/a/1190000006158186#articleHeader0
1 三范式:
1NF:原子性。关系型数据库的都是
2NF:没有重复的记录
3NF:数据没有冗余。即能用外键关联,就使用外键。
逆范式:为程序方便,保留冗余数据在1:N中的1端。
2,优化:
1)show status:
show session status like 'Com_%' //查看当前会话的命令
show global status like 'Com_%' //查看全局的命令
eg:
show status like 'Connections' //服务器连接次数
show status like 'Uptime' // 启动的时间
show status like 'Slow_queries' //慢查询次数,默认是10分才算是慢查询
show variables like 'long_query_time' //慢查询的时间
set long_query_time=2 //设置慢查询的时间
2)记录慢查询日记:
bin\mysqld.exe -slow-query-log
在my.ini,会记录日记放在位置
3)Explain SQL语句:
Id:
type: consts是好的;ALL表示全表扫描
possible_key: 可能使用的索引
key:使用的索引
rows: 扫描的行数
Extra: 排序细节。文件排序,效率差
3,索引:
1)适合索引的场景:
作为查询的字段,适合建索引
唯一性太差的,不适合;eg: 性别
变化频繁的字段,不适合
2)索引类型
主键索引、唯一索引、普通索引、全文索引、复合索引
创建索引:
createcreate [unique|fullTxt]index on 表名(列名) --- drop index index_name on table
alter table add primary key(列名) --- alter table 表名 drop index 索引名
查询索引:
show index from 表名
show keys from 表名
desc 表名
索引的使用:
a 多列索引,必须在使用最左边的列,否则不使用索引
b like 查询,使用%开关,不使用索引
c or 条件时,除非所有列都是有索引,否则不使用索引
d 类型是字符类型,数据要使用引号,否则不走索引
索引的效率:
show status like 'Handler_read_%' 中,hander_read_key高,则效率高;hander_red_rnd_key高,则效率低
4,常用优化手段:
1) 导入数据时:
MyISAM引擎:
alter table XXX disable keys;
loading data
alter table XXX enable keys;
Innodb:
导入的数据按主键排序;
set unique_checks = 0 ;关闭唯一性校验
set autocommit=0; 关闭自动提交
2)group by 时,自动加上order by null
3) 尽量使用join代替子查询
4)or/and 的条件都要使用索引
5, MyISAM 与InnoDB:
1)前者:不支持事务、不支持外键。对于少量更新、删除时,速度快。
2)后者:支持事务、外键。写效率较差,且占用空间多。
MyISAM:可执行optimize table XXX 来释放空间
6,数据库参数设置:
Innodb:
innodb_additional_mem_pool_size = 64M
innodb_buffer_pool_size = 1G
MyISAM:
调整key_buffer_size
https://segmentfault.com/a/1190000006158186#articleHeader0
1 三范式:
1NF:原子性。关系型数据库的都是
2NF:没有重复的记录
3NF:数据没有冗余。即能用外键关联,就使用外键。
逆范式:为程序方便,保留冗余数据在1:N中的1端。
2,优化:
1)show status:
show session status like 'Com_%' //查看当前会话的命令
show global status like 'Com_%' //查看全局的命令
eg:
show status like 'Connections' //服务器连接次数
show status like 'Uptime' // 启动的时间
show status like 'Slow_queries' //慢查询次数,默认是10分才算是慢查询
show variables like 'long_query_time' //慢查询的时间
set long_query_time=2 //设置慢查询的时间
2)记录慢查询日记:
bin\mysqld.exe -slow-query-log
在my.ini,会记录日记放在位置
3)Explain SQL语句:
Id:
type: consts是好的;ALL表示全表扫描
possible_key: 可能使用的索引
key:使用的索引
rows: 扫描的行数
Extra: 排序细节。文件排序,效率差
3,索引:
1)适合索引的场景:
作为查询的字段,适合建索引
唯一性太差的,不适合;eg: 性别
变化频繁的字段,不适合
2)索引类型
主键索引、唯一索引、普通索引、全文索引、复合索引
创建索引:
createcreate [unique|fullTxt]index on 表名(列名) --- drop index index_name on table
alter table add primary key(列名) --- alter table 表名 drop index 索引名
查询索引:
show index from 表名
show keys from 表名
desc 表名
索引的使用:
a 多列索引,必须在使用最左边的列,否则不使用索引
b like 查询,使用%开关,不使用索引
c or 条件时,除非所有列都是有索引,否则不使用索引
d 类型是字符类型,数据要使用引号,否则不走索引
索引的效率:
show status like 'Handler_read_%' 中,hander_read_key高,则效率高;hander_red_rnd_key高,则效率低
4,常用优化手段:
1) 导入数据时:
MyISAM引擎:
alter table XXX disable keys;
loading data
alter table XXX enable keys;
Innodb:
导入的数据按主键排序;
set unique_checks = 0 ;关闭唯一性校验
set autocommit=0; 关闭自动提交
2)group by 时,自动加上order by null
3) 尽量使用join代替子查询
4)or/and 的条件都要使用索引
5, MyISAM 与InnoDB:
1)前者:不支持事务、不支持外键。对于少量更新、删除时,速度快。
2)后者:支持事务、外键。写效率较差,且占用空间多。
MyISAM:可执行optimize table XXX 来释放空间
6,数据库参数设置:
Innodb:
innodb_additional_mem_pool_size = 64M
innodb_buffer_pool_size = 1G
MyISAM:
调整key_buffer_size