mysql 高性能日记之索引(持续更新)
本文仅限于自己读写的笔记,需要具有一定 mysql(inodb,myisam 引擎)基础的高端玩家,不感兴趣的玩家们就不用在意了
Inodb 引擎
1,每个新建索引,都需要考虑清楚看是否是必须的,很多新建的索引不仅不会提高 sql 语句的效率,反而会增加维护索引的成本
对于 Inodb 的 B-Tree,如果是非聚簇索引,每次检索都需要进行两次(本身+主键,此处不过多解释),所以当存在索引 (B),A是主键,就没有必要再建立索引(B, A),除非需要 order by a 才需要用到组合索引。
MyISAM 引擎
1,默认开启索引前缀压缩,对于 CPU 密集型业务需要手动关闭该功能,MyISAM 为了降低 IO 的压力,将索引块进行前缀压缩,比如 "aaaa"-"aaaabbb" 两个索引块在内存中为 "aaaa"-"4.bbb",解压时会消耗一定的 CPU 算力。
公共问题
1,扩展索引时,也需要考虑是否会影响到旧索引的性能
原本存在索引(A,qps 超高),为了整合索引,将 B(VCHAR1024) 加入原索引构成新索引(A, B),由于加入新的列(新列超长,会极大影响到旧查询效率)。
2,对于两个表 A {primary_key: app_id,column:xxx};B {primary_key: account_id,app_id},其中 A 表的 app_id 和 B 表的 app_id 是同一个属性,如果业务给定一个 account_id,需要返回这个用户下的所有 app 信息,相信不少同学会这样写
a. select * from A where app_id in (select app_id from B where account_id = %d)
b. select * from A join (select app_id from B where account_id = %d) as C using (app_id)
上述两种写法应该是大部分开发者都会优先考虑的 sql 语句(正向思维),但 Mysql 优化器并不会优化上面两种 sql 语句,而是会按从左到右的顺序,现对 A 表进行全表遍历,然后与 B 表查出的数据进行 using 比较返回有效数据。所以需要大家反向去写 sql 语句;这个问题是在 mysql(5.6) 之前的问题,在优化器中会把 a 语句转换为 select * from A where exists (select app_id from B where account_id = %d),所以才会产生上述的问题,这里写这些不是为了误导大家,而是提醒大家任何语句都不要想当然理解其原理,而是需要实践出真理,否则一定会产生血的教训
c. select * from B where account_id = %d join (select * from A) as C using (app_id)
当然,如果在两个表中都没有可供 where 使用的有效索引,那就老老实实全表遍历吧。
mysql 高性能日记之索引(持续更新)的更多相关文章
- mysql日常使用总结(持续更新中)
记录一些日常的mysql常用的使用, 方便随用随查. 一.表结构 1.1 查看表结构 方式1: 可以查看建表语句,完整的表结构. show create table table_name; 方式2:可 ...
- 关于mysql的使用命令(持续更新中...)
特别提示 本说明中的mysql 是基于windwos平台下的5.5 版本 安装完成后 请到mysql中设置配置文件 链接分享:链接:https://pan.baidu.com/s/1tv4ulZ ...
- MySQL 面试题汇总(持续更新中)
COUNT COUNT(*) 和 COUNT(1) 根据 MySQL 官方文档的描述: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) opera ...
- mysql优化理解笔记(持续更新)
主要包括存储引擎.索引.sql语句 一.存储引擎 目前最常见的是InnoDB和MyISAM两个存储引擎 (1)InnoDB:支持事务处理,提供行级锁.外键约束索引,行锁 (2)MyISAM:支持全文搜 ...
- Mysql 简单问题汇总(持续更新)
主从架构相关问题 问题现象:从机连接主机时报错 [ERROR] Slave I/O: error connecting to master 'repl@192.168.0.50:3306' - ret ...
- MySQL日常运维操作---持续更新
1.查看当前连接数: 这些参数都是什么意思呢? Threads_cached ##mysql管理的线程池中还有多少可以被复用的资源 Threads_connected ##打开的连接数 Threads ...
- MySQL数据库知识点整理 (持续更新中)
一.修改用户密码 格式(在命令行下输入):mysqladmin -u 用户名 -p旧密码 password 新密码 1. 给root添加密码ab12: mysqladmin -uroot -pass ...
- 在测试时用到的一些mysql的小技巧(持续更新)
经常使用的快捷键: 1.ctrl+q 打开查询窗口 2.ctrl+/ 注释sql语句 3.ctrl+shift +/ 解除注释 4.ctrl+r 运行查询窗口的sql语句 5.ctrl+shift+r ...
- mysql出现问题汇总(持续更新)
1.mysql -uqwe -p普通用户登陆时提示: ERROR 1045 (28000): Access denied for user 'baijie'@'%' (using password: ...
随机推荐
- PyTorch 启程&拾遗
1..Tensors are similar to NumPy’s ndarrays, with the addition being that Tensors can also be used on ...
- ClassLoader源码分析与实例剖析
在之前已经对类加载器做了不少实验了,这次主要是来分析一下ClassLoader的源码,当然主要是先从理解官方给它的注释开始,为之后自定义类加载器打好坚石的基础,下面开始: 而从类的层次结构来看也能感受 ...
- mybatis的简单搭建和使用(一)
前言 mybatis是一个持久层的框架,那么问题来了,什么是持久层的框架呢,持久层就是把数据持久化的保存到数据库中,这种过程一般叫数据持久化的过程,现为了程序员能够很方便的操作数据库,于是就出现持久层 ...
- AI行业精选日报_人工智能(12·23)
日本探索用人工智能指挥交通 据日本共同社报道,日本一家机构正在研究开发一套新的交通系统,将应用人工智能技术分析数据来缓解城市交通拥堵.报道称,在日本新能源和产业技术综合开发机构研发的这套系统中,人工智 ...
- Hosts 文件切换工具
建议删除无用的注释,否则在启用全部的时候会把注释和说明内容的注释取消掉 下载地址:
- Java用递归实现全排列,详细
package edu.cqu.algorithmTest; import java.util.Scanner; // 全排列,递归实现 public class Main8 { public sta ...
- css hack的理解
什么是CSS hack 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中呈 ...
- [转载]ORM-PetaPoco 小型ORM框架
轻量级ORM-PetaPoco及改进 作者:帮助您 发布:2013-04-26 06:03 分类:软件综合问题 阅读:371次 评论关闭 PetaPoco描述 PetaPoco ...
- HDU 6102 - GCDispower | 2017 Multi-University Training Contest 6
个人感觉题解的复杂度很玄,参不透,有没有大佬讲解一下- - /* HDU 6102 - GCDispower [ 数论,树状数组] | 2017 Multi-University Training C ...
- React-router的使用:标签跳转和编程式跳转
目录: 1.demo:NavLink 标签跳转 2.标签渲染路由组件时,获取url参数 3.编程式跳转 参考文档 1)https://reacttraining.com/react-router/we ...