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: ...
随机推荐
- 通过轻量级终端工具Tera Term远程向linux操作系统上传war文件
通过轻量级终端工具Tera Term远程向linux操作系统上传war文件 1.打开Tera Term终端工具,并输入正确的远程机器的IP地址以及端口号: 2.输入正确的用户名和密码进入到linux操 ...
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- django-session的使用---数据库,缓存型
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session Django默认支持Se ...
- docker 共享卷
宿主机与容器共享存储 [root@docker02 ~]# docker run -it -v /var/webroot:/abc 192.168.1.21:5000/busybox # 宿主机文件 ...
- 创建虚拟机(kvm)
--virsh console virt_name -- virsh nodeinfo # 查看kvm节点(服务器)信息 --virsh list [--all ...
- docker并不能把部署的工作「减少为0」,比较好的情况下是「基本减少为1」
很多人说docker改变了运维世界,这句话是从群体角度来说的,是统计学意义上的改变,像mysql,python这样被大规模使用的基础应用,docker化之后为整个群体所节省的时间是非常巨大的. 有人可 ...
- Docker 阿里云镜像加速
1.进入阿里云镜像加速页面: https://cr.console.aliyun.com/#/accelerator 2.修改/etc/docker/daemon.json文件配置,没有则新建: ? ...
- 使用Future、asyncio处理并发
并发的意义 为了高效处理网络I/O,需要使用并发,因为网络有很高的延迟,所以为了不浪费CPU周期去等待,最好在收到网络响应之前做些其他的事. 在I/O密集型应用中,如果代码写得正确,那么不管是用哪种并 ...
- javascript面向对象 用new创建一个基于原型的javascript对象
//创建一个类 其实就是个对象 var Student={ name:"robot", height:1.6, run:function(){ console.log(this.n ...
- 利用状态机(FSM)进行简单的uart串口发送数据
module uart_tx(clk,rst_n,key,txd); input clk; input rst_n; input key; output reg txd; :] state; :] b ...