MySQL优化

1.数据库表设计
3NF(范式):首先符合1NF,才能满足2NF,进一步满足3NF
1NF:表的列具有原子性,不可再分解,只要数据库是关系型数据库就自动满足1NF
2NF:表中的记录是唯一的,通常设置主键来实现
3NF:表中数据不要有冗余数据,表的数据能够被推倒出来的就不应该单独设计一个字段 
反范式:有时候为了查询便捷可以接受数据冗余

#存储引擎的选择
SHOW ENGINES;
InnoDB:Supports transactions, row-level locking, and foreign keys
MyISAM:表级锁、不支持事务和外键
MEMORY:Hash based, stored in memory, useful for temporary tables(被mongodb、redis等NOSQL替代)

#MyISAM清理碎片
OPTIMIZE TABLE table_name

2.索引
#慢查询
SHOW STATUS;
SHOW STATUS LIKE 'uptime';
#[session/global]不写默认session(表示当前连接select/insert/update/delete次数)
SHOW SESSION STATUS LIKE 'com_select';
SHOW GLOBAL STATUS LIKE 'com_insert';
SHOW STATUS LIKE 'connections';
#慢查询次数
SHOW STATUS LIKE 'slow_queries';
#slow_query_log=ON开启 slow_query_log_file慢查询日志存放的位置
SHOW VARIABLES LIKE 'slow_query%';
#mysql默认设置10秒是慢查询
SHOW VARIABLES LIKE 'long_query_time';
#修改慢查询时间
(重启MySQL后恢复原值10)
SET long_query_time = 1;
#慢查询测试,查看是否会记录到慢查询日志文件中
SELECT sleep(2);

#my.ini配置
慢查询(重启MySQL有效)
# [mysqld]
# slow-query-log=1
# slow_query_log_file="OGMMYQJQQORRBAW-slow.log"
# long_query_time=10

#查看MySQL执行计划
EXPLAIN SELECT语句

#索引的创建与使用
一:创建索引的前提:
(1).查询频繁的字段应创建索引
(2).唯一性差的字段不适合建索引,如gender='男'|'女'
(3).更新频繁的字段不适合建索引(维护索引B+树耗时)
(4).不会出现在WHERE子句中的字段不用建索引

二:不使用索引的情况
(1)如果条件中有OR,所有使用到的字段都有索引才会使用索引
(2)组合索引,只有查询条件使用了最左边的列,索引一般就会被使用,否则不会使用索引
(3)LIKE '%xxx' 不会使用索引
(4)如果列类型是字符串,那么一定要在条件中将数据使用引号引用起来,否则不使用索引

#查看索引使用情况
SHOW STATUS LIKE 'Handler_read%';
#Handler_read_key:这个值越高越好,表示使用索引查询到的次数
#Handler_read_rnd_next:越高越不好,越高说明越低效

#优化Sql性能
(1)GROUP BY
GROUP BY后的结果,Mysql搜索引擎会将结果按照GROUP BY的字段按照升序,自动排序Using filesort
当数据量非常庞大,并且GROUP BY的字段又非索引字段,对于结果集,又没有排序的需求,
那么 此时的自动排序功能,将影响到sql的性能,所以我们需要使用 ORDER BY NULL 来解决,强制解除排序

3.分表技术(水平分割、垂直分割)
(1)水平分割
(2)垂直分割


4.读写分离

5.MySQL配置优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值