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配置优化
MySQL优化
最新推荐文章于 2024-08-23 19:00:01 发布