本文仅限于自己读写的笔记,需要具有一定 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 高性能日记之索引(持续更新)的更多相关文章

  1. mysql日常使用总结(持续更新中)

    记录一些日常的mysql常用的使用, 方便随用随查. 一.表结构 1.1 查看表结构 方式1: 可以查看建表语句,完整的表结构. show create table table_name; 方式2:可 ...

  2. 关于mysql的使用命令(持续更新中...)

    特别提示  本说明中的mysql 是基于windwos平台下的5.5 版本 安装完成后 请到mysql中设置配置文件   链接分享:链接:https://pan.baidu.com/s/1tv4ulZ ...

  3. MySQL 面试题汇总(持续更新中)

    COUNT COUNT(*) 和 COUNT(1) 根据 MySQL 官方文档的描述: InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) opera ...

  4. mysql优化理解笔记(持续更新)

    主要包括存储引擎.索引.sql语句 一.存储引擎 目前最常见的是InnoDB和MyISAM两个存储引擎 (1)InnoDB:支持事务处理,提供行级锁.外键约束索引,行锁 (2)MyISAM:支持全文搜 ...

  5. Mysql 简单问题汇总(持续更新)

    主从架构相关问题 问题现象:从机连接主机时报错 [ERROR] Slave I/O: error connecting to master 'repl@192.168.0.50:3306' - ret ...

  6. MySQL日常运维操作---持续更新

    1.查看当前连接数: 这些参数都是什么意思呢? Threads_cached ##mysql管理的线程池中还有多少可以被复用的资源 Threads_connected ##打开的连接数 Threads ...

  7. MySQL数据库知识点整理 (持续更新中)

    一.修改用户密码 格式(在命令行下输入):mysqladmin -u 用户名 -p旧密码 password 新密码 1. 给root添加密码ab12:  mysqladmin -uroot -pass ...

  8. 在测试时用到的一些mysql的小技巧(持续更新)

    经常使用的快捷键: 1.ctrl+q 打开查询窗口 2.ctrl+/ 注释sql语句 3.ctrl+shift +/ 解除注释 4.ctrl+r 运行查询窗口的sql语句 5.ctrl+shift+r ...

  9. mysql出现问题汇总(持续更新)

    1.mysql -uqwe -p普通用户登陆时提示: ERROR 1045 (28000): Access denied for user 'baijie'@'%' (using password: ...

随机推荐

  1. set调用add报错:

    Map<String, String> goodsStandMap = new HashMap<>();goodsStandMap.put("key1", ...

  2. pyltp安装

    第一步:下载wheel文件 第二步:进入该文件的文件夹 第三步:pip install wheel文件名 注意:python的安装版本必须和pyltp的版本相同,我这版本都是pyhton3.6.之前p ...

  3. c#客户端自动更新模块

    一.概述 将需要更新的文件上传到服务器端,然后客户端从服务器下载更新文件并覆盖本地文件. 二.功能模块 1.将更新文件放入指定文件夹,检测更新,生成更新配置文件,并上传到服务器 2.获取服务器的更新配 ...

  4. webpack Uncaught ReferenceError: Swiper is not defined

    一.报错原因:Swiper的JS文件没有加载成功,或者说swiper丢失了依赖(正常操作是:加载后再初始化Swiper) 二.解决方法:在初始化 Swiper 的js文件中导入 Swiper impo ...

  5. maven热部署插件-jetty

    作者:小勇Oo 关于maven-jetty-plugin的说明: pom文件中: <build> <finalName>freemarker</finalName> ...

  6. Centos7静态ip设置(亲测有效)

    本文引自:https://www.cnblogs.com/toov5/p/10340395.html,特此鸣谢 最近想测试消息中间件等各类web集群相关技术,这就需要解决linux主机之间互联互通的若 ...

  7. [2019HDU多校第一场][HDU 6588][K. Function]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588 题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3] ...

  8. MySQL剖析单条查询

    使用SHOW PROFILE SHOW PROFILE命令默认是禁用的,可以通过以下命令修改 SET profiling=1; 当一条查询提交给服务器时,,此工具会记录剖析信息到一张临时表,并且给查询 ...

  9. Codeforces Round #587 (Div. 3) D. Swords

    链接: https://codeforces.com/contest/1216/problem/D 题意: There were n types of swords in the theater ba ...

  10. vue_03 练习

    1.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/001.png', title: 'tv1'}, {img: 'img/tv/002.p ...