商城网站平台怎么做,如何做网络营销,网站建设带支付源码,用模板搭建的网站备案吗文章目录 一、MySQL-优化1、在MySQL中#xff0c;如何定位慢查询?2、SQL语句执行很慢, 如何分析呢#xff1f;3、了解过索引吗#xff1f;#xff08;什么是索引#xff09;4、索引的底层数据结构了解过嘛 ?5、什么是聚簇索引什么是非聚簇索引 ?6、知道什么是回表查询嘛… 文章目录 一、MySQL-优化1、在MySQL中如何定位慢查询?2、SQL语句执行很慢, 如何分析呢3、了解过索引吗什么是索引4、索引的底层数据结构了解过嘛 ?5、什么是聚簇索引什么是非聚簇索引 ?6、知道什么是回表查询嘛 ?7、知道什么叫覆盖索引嘛 ?8、MYSQL超大分页怎么处理 ?9、索引创建原则有哪些10、什么情况下索引会失效 ?(在联合索引的情况下11、谈一谈你对sql的优化的经验 二、事务1、事务的特性是什么可以详细说一下吗2、并发事务带来哪些问题怎么解决这些问题呢MySQL的默认隔离级别是2.1. 并发事务问题2.2. MySQL的默认隔离级别 一、MySQL-优化
1、在MySQL中如何定位慢查询?
方案一开源工具
调试工具Arthas 运维工具Prometheus 、Skywalking
方案二MySQL自带慢日志
可在MySQL的配置文件/etc/my.cnf中配置如下信息:
# 开启MySQL慢日志查询开关
slow_query_log1# 设置慢日志的时间为2秒SQL语句执行时间超过2秒就会视为慢查询记录慢查询日志
long_query_time2慢日志文件中记录会记录sql执行时间超过设置时间的sql信息 localhost-slow.log。
其中就包括了sql执行的耗时以及记录sql语句 2、SQL语句执行很慢, 如何分析呢
采用MySQL自带的分析工具 EXPLAIN: 也就是在sql前面加上EXPLAIN 通过key和key_len检查是否命中了索引索引本身存在是否有失效的情况通过type字段查看sql是否有进一步的优化空间是否存在全索引扫描或全盘扫描通过extra建议判断是否出现了回表的情况如果出现了可以尝试添加索引或修改返回字段来修复 3、了解过索引吗什么是索引
索引index是帮助MySQL高效获取数据的数据结构(有序)提高数据检索的效率降低数据库的IO成本不需要全表扫描通过索引列对数据进行排序降低数据排序的成本降低了CPU的消耗 4、索引的底层数据结构了解过嘛 ? MySQL的InnoDB引擎采用的B树的数据结构来存储索引
阶数更多路径更短磁盘读写代价B树更低非叶子节点只存储指针叶子阶段存储数据B树便于扫库和区间查询叶子节点是一个双向链表 5、什么是聚簇索引什么是非聚簇索引 ?
聚簇索引: 聚簇索引聚集索引数据与索引放到一块B树的叶子节点保存了整行数据有且只有一个 非聚簇索引 非聚簇索引二级索引数据与索引分开存储B树的叶子节点保存对应的主键可以有多个 6、知道什么是回表查询嘛 ?
要解释回表就得解释一下聚簇索引和非聚簇索引。 通过二级索引找到对应的主键值到聚集索引中查找整行数据这个过程就是回表 也就是说通过二级索引查到的仅仅是主键的值索引还要根据查到的主键通过聚簇索引去查询到整条数据的信息。 7、知道什么叫覆盖索引嘛 ?
覆盖索引是指 查询使用了索引并且需要返回的列在该索引中已经全部能够找到, 也就是通过索引能直接查询到想要的数据不需要回表。 例如下面的sql
覆盖索引是指查询使用了索引返回的列必须在索引中全部能够找到使用id查询直接走聚集索引查询一次索引扫描直接返回数据性能高。如果返回的列中没有创建索引有可能会触发回表查询尽量避免使用select * 8、MYSQL超大分页怎么处理 ? 可以使用覆盖索引子查询解决 9、索引创建原则有哪些
1). 数据量较大且查询比较频繁的表 2). 常作为查询条件、排序、分组的字段 3). 字段内容区分度高 4). 内容较长使用前缀索引 5). 尽量联合索引 6). 要控制索引的数量 7). 如果索引列不能存储NULL值请在创建表时使用NOT NULL约束它 10、什么情况下索引会失效 ?(在联合索引的情况下 假设该表使用了如下联合索引 name status address 违反最左前缀法则 范围查询右边的列不能使用索引 不要在索引列上进行运算操作 索引将失效 字符串不加单引号造成索引失效。(类型转换) 以%开头的Like模糊查询索引失效 11、谈一谈你对sql的优化的经验
1. 表的设计优化 比如设置合适的数值tinyint int bigint要根据实际情况选择 比如设置合适的字符串类型char和varcharchar定长效率高varchar可变长度效率稍低 2. 索引优化 3. SQL语句优化 SELECT语句务必指明字段名称避免直接使用select * 也是为了能使用覆盖索引用什么数据就查什么数据 SQL语句要避免造成索引失效的写法 尽量用union all代替union union会多一次过滤效率低(数据量多了执行过滤操作耗时严重 避免在where子句中对字段进行表达式操作也就是怕索引失效 Join优化 能用innerjoin 就不用left join right join如必须使用 一定要以小表为驱动 内连接会对两个表进行优化优先把小表放到外边把大表放到里边。left join 或 right join不会重新调整顺序 4. 主从复制、读写分离
如果数据库的使用场景读的操作比较多的时候为了避免写的操作所造成的性能影响 可以采用读写分离的架构。读写分离解决的是数据库的写入影响了查询的效率。 5. 分库分表
只在数据量非常大的情况才去做 二、事务
1、事务的特性是什么可以详细说一下吗
原子性Atomicity事务是不可分割的最小操作单元要么全部成功要么全部失败。不成功便成仁一致性Consistency事务完成时必须使所有的数据都保持一致状态。双方都是一致的状态隔离性Isolation数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立环境下运行。不受干扰持久性Durability事务一旦提交或回滚它对数据库中的数据的改变就是永久的。(写进磁盘
很好的例子就是转账操作
2、并发事务带来哪些问题怎么解决这些问题呢MySQL的默认隔离级别是
2.1. 并发事务问题
脏读一个事务读到另外一个事务还没有提交的数据。 不可重复读一个事务先后读取同一条记录但两次读取的数据不同称之为不可重复读。 幻读一个事务按照条件查询数据时没有对应的数据行但是在插入数据时又发现这行数据已经存在好像出现了”幻影”。
2.2. MySQL的默认隔离级别
解决方案对事务进行隔离 默认采用的隔离机制可重复读(不能解决幻读但是相比其他的隔离机制在性能和安全级别算是最优解了 更新中》》》》》》》 参考来自黑马程序员