前端开发中英文网站怎么做,建设银行网站首页是多少,如何做好网站建设和宣传,网站源码还可以做授权么一、慢查询
1、常见情形
聚合查询
多表查询
表数据量过大查询
深度分页查询
2、定位慢查询
方案一、开源工具
调试工具#xff1a;Arthas运维工具#xff1a;Prometheus、Skywalking
方案二、MySQL自带慢日志
在MySQL配置文件 /etc/my.conf 中配置#xff1a;
# …
一、慢查询
1、常见情形
聚合查询
多表查询
表数据量过大查询
深度分页查询
2、定位慢查询
方案一、开源工具
调试工具Arthas运维工具Prometheus、Skywalking
方案二、MySQL自带慢日志
在MySQL配置文件 /etc/my.conf 中配置
# 开启MySQL慢日志开关
slow_query_logON
# 设置慢日志时间2秒超过2秒的SQL语句会被认为是慢查询记录慢查询日志
long_query_time2
# 慢日志记录文件
slow_query_log_file /var/lib/mysql/localhost-slow.log
重启MySQL服务器后续可在对应日志文件中查看慢日志信息。
3、慢SQL优化
聚合查询考虑增加临时表多表查询优化SQL语句表数据量过大增加索引深度分页查询
其中聚合查询、多表查询、数据量过大的情况均可以使用SQL执行计划分析进行优化。使用MySQL自带命令 explain 或 desc
EXPLAIN/DESC 原SQL语句 字段含义
possible_key当前SQL可能会使用到的索引key当前SQL实际命中的索引key_len索引key占用空间大小Extra额外的优化建议 Using whereUsing index使用了索引需要的数据在索引中都能够找到不需要回表查询。Using index condition使用了索引但是需要回表查数据。type该SQL数据访问/操作的类型性能从好到差依次为NULL、system、const、eq_ref、ref、range、index、all。 ALL扫描全部数据MySQL将遍历全表以找到匹配的行index遍历索引索引树扫描range索引范围查找ref使用非唯一索引查找数据eq_ref类似ref区别是使用的索引为唯一索引对于每个索引的键值表中只有一条记录匹配。const根据主键查询system查询mysql自带的表 Q某条SQL查询很慢如何分析 A可以使用MySQL自带分析工具EXPLAIN。 通过key和key_len检查是否命中了索引索引本身存在是否有失效的情况通过type字段查看sql是否有进一步的优化空间是否存在全索引扫描或全盘扫描通过extra建议判断是否出现了回表的情况如果出现了可以尝试添加索引或修改返回字段来修复 二、MySQL存储引擎
1、分类
存储引擎是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎基于表而非基于数据库。
# 特性MyISAMInnoDBMEMORY事务×✔×锁机制表锁表锁、行锁表锁外键×✔×
在mysql中提供了很多的存储引擎比较常见有InnoDB、MyISAM、Memory
InnoDB存储引擎是mysql5.5之后是默认的引擎它支持事务、外键、表级锁和行级锁 DML操作遵循ACID模型支持事务行级锁提高并发性能支持外键FOREIGN KEY 约束保证数据的完整及正确性。MyISAM是早期的引擎不支持事务、只有表级锁、也没有外键用的不多Memory主要把数据存储在内存支持表级锁没有外键和事务用的也不多
2、体系结构 三、索引
索引index是帮助MySQL高效获取数据的数据结构(有序)。在数据之外数据库系统还维护着满足特定查找算法的数据结构B树这些数据结构以某种方式指向数据 这样就可以在这些数据结构上实现高级查找算法这种数据结构就是索引。
1、B树 2、B树 MySQL的InnoDB引擎采用的B树的数据结构来存储索引
阶数更多路径更短磁盘读写代价B树更低非叶子节点只存储指针叶子阶段存储数据B树便于扫库和区间查询叶子节点是一个双向链表叶子节点内部为单向链表。
B树与B树对比:
①磁盘读写代价B树更低②查询效率B树更加稳定③B树便于扫库和区间查询
3、聚簇索引与非聚簇索引
聚簇索引数据存储和索引在一块索引结构的叶子节点保存了行数据。聚簇索引在每张表中都有且仅有一个。
非聚簇索引二级索引将数据与索引分开存储叶子节点关联的内容为对应的主键。一张表可以有多个二级索引。
聚集索引选取规则:
如果存在主键主键索引就是聚集索引。如果不存在主键将使用第一个唯一索引UNIQUE作为聚集索引。如果表没有主键且没有合适的唯一索引则 InnoDB 会自动生成一个rowid作为隐藏的聚集索引。
回表查询通过二级索引找到对应的主键然后根据主键值通过聚簇索引找到对应的行数据这个查找的过程称为回表。
4、覆盖索引
覆盖索引指查询使用了索引并且需要返回的列在该索引中已经全部能够找到 。
使用id查询直接走聚集索引查询一次索引扫描直接返回数据性能高。如果返回的列中没有创建索引可能会触发回表查询尽量避免使用 select *。
# 超大分页问题处理
数据量较大的情况使用 limit 分页查询查询越靠后查询效率越低。
优化思路一般分页查询时通过创建 覆盖索引 能够比较好地提高性能可以通过 覆盖索引 子查询 的形式进行优化。
select * from tb_sku t,(select id from tb_sku order by id limit 90000,10) a
where t.id a.id;Q超大分页怎么处理 A超大分页一般在数据量较大时使用了limit分页查询且需要对数据进行排序。这种情况下查询的效率就会比较低可以采用覆盖索引和子查询解决。 首先分页查询数据的主键id字段然后用子查询来过滤只需要查询这个id列表中的数据即可。因为查询id的时候走的是覆盖索引所以效率会提升。 5、创建索引的原则
依次考虑主键索引、唯一索引、复合索引根据业务情况创建
原则
数据量较大且查询比较频繁的表创建索引例10万条针对查询条件 where 、排序 sort by 、分组 group by 等操作的字段创建索引选择区分度高的字段作为索引优先创建唯一索引检索效率高字符串类型的字段如果长度较长可以考虑创建前缀索引取字段的前一部分涉及多字段作为查询条件的情况尽量使用联合索引减少单列索引。联合索引很多时候可以覆盖索引可以避免回表节省存储空间需要控制索引的数量索引数量越多维护索引的代价也越大同时影响增删改的效率如果某个字段不能存储NULL值建表语句对应该字段应当使用 NOT NULL 约束。当优化器知道每列是否包含NULL值时它可以更好地确定哪个索引最有效地用于查询。
6、索引失效的情况
1判断索引是否失效
explain 命令例
假设我们在student表中有一个联合索引“idx_age_name_grade (nameage, grade)”
explain select * from student where name zhangsan and age 20 and grade 3;
explain select * from student where name zhangsan grade 3;
explain select * from student where age 20 and grade 3;可以通过对比上述语句的输出内容key 、 key_len ...查看索引的使用情况。
2失效的场景
使用聚合索引违反最前左缀原则如上述student表查询条件无name且包括age或grade的情况联合索引查询语句使用了范围查询右边的列索引不会生效如select * from student where name zhangsan and age 20 and grade 3范围查询“age 20” 右侧的 grade 字段索引不生效 在索引列上进行了运算索引会失效字符串对应的字段查询语句不加引号出现类型转换引起失效like查询以 % 开头的模糊查询如果仅仅是以 % 结尾的 like 查询索引不会失效or 前后没有同时使用索引索引字段使用了 IS NULL 、IS NOT NULL、not、! 等mysql评估全表扫描比使用索引查询快 注意联合索引的情况如果只是查询条件里的查询顺序和索引定义的顺序不同不影响走索引。索引优化器会对查询条件进行优化即进行重新排序。 7、SQL优化总述
涉及方面
表的设计优化 选用合适的字段类型SQL语句优化 索引优化关联 “5、索引创建原则”、“6、索引失效情况” 尽量避免使用 select *防回表Join优化能用innerjoin 就不用left join right join如必须使用 一定要以小表为驱动。内连接会对两个表进行优化优先把小表放到外边把大表放到里边。left join 或 right join不会重新调整顺序。主从复制、读写分离分库分表
1主从复制 2分库分表 四、事务
事务是一组操作的集合它是一个不可分割的工作单位事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求即这些操作要么同时成功要么同时失败。
1、事务的特性ACID
原子性 Automaticity事务是不可分割的工作单位要么全部成功要么全部失败一致性 Consistency事务将数据库从一种状态转变为下一种一致的状态隔离性 Isolation不受并发操作的影响事务提交前对其他事务不可见持久性 Durability事务一旦提交其结果就是永久性的。即使发生宕机等故障数据库也能将数据恢复。 例A向B操作转账100元 原子性A扣除100B增加100要么都成功要么都失败 一致性数据在事务执行前后一致转账前后A扣除了100B必须增加100 隔离性A向B转账不受其他事务的影响 持久性事务提价后需要将数据持久化落盘操作。 2、并发问题
脏读、不可重复读、幻读
脏读一个事务读取了另一个事务还没有提交的内容不可重复读一个事务前后读取同一条记录获取到的数据内容不同原因是查询的过程中其他事务做了更新操作幻读一个事务按照条件查询数据时没有对应的数据行但是在插入数据时又发现这行数据已经存在好像出现了”幻影”原因是查询过程中其他事务做了添加操作。
3、事务隔离级别 解决并发事务问题的方案对事务进行隔离。 1四种隔离级别
1READ UNCOMMITTED读未提交
事务中最低的级别该级别下的事务可以读取到另一个事务中未提交的数据也被称为脏读 Dirty Read。
2READ COMMITTED读提交
大多数数据库管理系统的默认隔离级别例如Oracle。
该级别下事务只能读其他事务已经提交的内容可以避免脏读但不能避免重复读、幻读的情况。
3REPEATABLE READ可重复读
MySQL默认的事务隔离级别可以避免脏读、不可重复读的问题确保同一个事务的多个实例在开发并发读取数据时会看到同样的数据行。该级别在理论上会出现幻读的情况但MySQL的存储引擎通过多版本并发控制MVCC解决了该问题。
4SERIALIZABLE串行化
事务的最高隔离级别强制对事务进行排序使事务之间不会发生冲突从而解决脏读、幻读、重复读的问题。
2各隔离级别可能出现的问题 4、undo log redo log 5、MVCC 参考内容
B站视频课程https://www.bilibili.com/video/BV1yT411H7YK
掘金https://juejin.cn/post/6985026799163932708