优化sql的步骤
定位慢sql分析慢sql给出解决方案(优化) 优化方案单机(表结构、索引、Sql(代码问题)): 表 合适表结构 3NF和反3NF 合适引擎 索引 分表(垂直分表和水平分表) Sql优化技巧多机(IO瓶颈): 集群(读写分离,让多台服务器提供服务) 分布式(把不同的业务分给不同的集群处理)其他优化方案 缓存 es 页面静态化- 测试:
准备两个数据库400万数据进行测试- 查询数据库(mysql)基本状态 运行多久
show status like ‘uptime’;
CRUD执行次数
show status like ‘%Com_%’
CRUD次数 show status like ‘%Com_select%’ show status like ‘%Com_insert%’ show status like ‘%Com_update%’ show status like ‘%Com_delete%’
Show session/global status like ‘%Com_select%’ show [session|global] status like … 如果你不写[session|global] 默认是session 会话(指取出当前窗口的执行),如果你想看所有(从mysql 启动到现在),则应该 global。
查询所有连接数 show status like ‘connections’
查看服务器响应的最大连接数 show status like ‘Max_used_connections’
通过查询(工作环境)最大并发连接数可以配置作为我们配置mysql最大连接数的依据。通常,mysql的最大连接数默认是100, 最大可以达到16384(理论上)。
查询慢查询次数 show status like ‘slow_queries’
查看和修改慢查询时间阈值 show variables like ‘long_query_time’ //可以显示当前慢查询时间 set long_query_time=1 ;//可以修改慢查询时间 set GLOBAL long_query_time=0.6;全局修改慢查询时间 注意: 直接修改global 的long_query_time 之后在当前的的窗口中是没有效果的,在新打开的窗口中才会有效果。如果想让本窗口也有效果 的话,不用加 global关键字。
把慢查询记录到日志中 bin\mysqld.exe --safe-mode --slow-query-log [mysql5.5 可以在my.ini指定] 注意事项: 1 必须在mysql的安装目录执行,因为执行的使用依赖于my.ini(C:\Program Files\MySQL\MySQL Server 5.7), 2 慢查询日志会输出到data.dir(datadir=C:/ProgramData/MySQL/MySQL Server 5.7\Data)
explain sql语句; EXPLAIN select * from emp WHERE empno=4099030;
通过 explain 语句可以分析,mysql如何执行你的sql语句.
找到原因以后就解决
1NF:表的列具有原子性,不可再分解。 即列的信息,不能分解.只要数据库是关系型数据库(mysql/oracle/db2/sysbase/sql server),就自动的满足1NF.关系型数据库中是不允许分割列的。
2NF: 表的记录是唯一的,我们使用主键来实现。3NF:表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放反3NF :没有冗余的数据库表未必是最好的数据库表,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
比如浏览次数、评论次数等,为了提高效率,直接在在外键表添加浏览数。方便查询!注意:当一个表数据发生改变是冗余字段也需要发生改变,可以使用触发器,提高效率,不用操作两个或者多个表。使用CREATE TRIGGER 来创建触发器。这里就不多说了,百度很多案例。。。 数据库触发器:https://www.cnblogs.com/zh-1721342390/p/9602941.htmlmysql常用的几种数据库引擎:myisam,innodb,memory 1)优缺点 MyISAM 和 INNODB以及memory的区别(主要)
事务安全 MyISAM不支持事务,INNODB支持,memory不支持事务查询和添加速度 MyISAM速度快,INNODB速度慢,memory速度快支持全文索引 MyIsam支持,innodb不支持锁机制 MyIsam表锁 innodb行锁外键 MyISAM 不支持外键约束, INNODB支持外键. (通常不设置外键,通常是在程序中保证数据的一致) 2)使用场景MyISAM存储引擎 如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. 比如 bbs 中的 发帖表,回复表.
INNODB存储引擎: 对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.
Memory 存储 比如我们数据变化频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory, 速度极快.
使用引擎
创建表时指定存储引擎 Create table 表名(字段列表) engine 存储引擎名称;注意:如果不指定则使用默认的存储引擎,这个默认实在my.ini配置
修改存储引擎: alter table table_name engine=innodb;