一、mysql的架构介绍

1.mysql采用的是分层设计模式,结合可插拔技术开发的。

2.mysql层次结构为:连接层>服务层>引擎层>存储层。

3.插件式的存储引擎架构将查询处理和其他系统任务以及数据的提取相分离。

4.mysql最常用的两种搜索引擎是:MyISAM 和 InnoDB(默认)。

5.MyISAM 和 InnoDB的区别以及选择:

两种类型最主要的差别就是InnoDB 支持事务处理与外键和行级锁.而MyISAM不支持.

读多写少用MyISAM,读少写多用InnoDB

二、索引的优化分析

1.索引的分类:

  • 单指索引:create index id_user_name on user(name)
  • 复合索引:create index id_user_nameEmil on user(name,email)

2.SQL的执行顺序

from>on>join/where>group by>having>select>order by>limit

3.索引是什么

索引(index)是帮助mysql高效获取数据的数据结构

简单说索引就是:排好序的快速查找的数据结构

数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这个数据结构以某种方式指向数据,这样可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。

4.索引的相关内容

  • 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
  • 索引默认的是B树索引(多路搜索树,并不一定是二叉树),还有聚集索引、次要索引、复合索引、哈希索引等。

5.索引的优缺点

  • 优点:提高了数据的检索效率,降低了数据库的IO成本。降低了数据库的排序成本,降低了CPU的消耗。
  • 缺点:索引也要占空间,而且修改数据时,索引也要跟着修改。

6.索引的分类

  • 单指索引:一个索引包含一个列,一个表可以有多个单指索引。
  • 唯一索引:索引列的值必须唯一,但允许为空。
  • 复合索引:索引包含多个列。

7.索引的基本语法

  • 创建:create [unique] index indexName on table(column)

alter table add [unique] index [indexName] on (column)

  • 删除:drop index [indexName] on table
  • 查看:show index from table

8.Explain(执行计划)的相关内容

  • id:id如果相同,则按从上往下的顺序执行,id值越大,越先执行。
  • select_type:查询类型,它的值有:simple、primary、subquery、derived、union等等。
  • table:操作的是哪张表。
  • type:type的值有:all、index、range、ref、eq_ref、const、system、null

其中查询使用的类型从最好到最差依次是:

system->const->eq_ref->ref->range->index->All

(1)system:表示只有一行记录,一般不会出现,没有意义。

(2)const:表示通过索引一次就可以找到。

(3)eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条数据与之对应。

(4)ref:非唯一性索引扫描,返回匹配的所有行。

(5)range:值检索给定范围的行,between、<>、in等。

(6)index:遍历所有索引。

(7)all:遍历全表。

  • possible_keys:显示可用的一个或多个索引,但不一定被查询实际使用。
  • key:实际使用到的索引。
  • key_len:表示索引中是用到的字节数,其值越小越好。
  • ref:显示索引的哪一列被使用了,如果可以,是一个常数。
  • rows:大致估算出找到所需记录需要读取的行数。
  • Extra:包含了不适合在其他列展示,但十分重要的信息。

(1) Using filesort:文件内排序,说明mysql使用了外部排序。

(2) Using temporary:使用了保存中间结构。(order by 、group by)

(3) Using index:效率不错,表名使用了索引。

(4) Using where:

9.何时需要建立索引

  • 主键自动建立唯一索引。
  • 频繁作为查询条件的字段应该创建索引。
  • 查询中与其他表关联的字段,外键关系建立索引。
  • 频繁更新的字段不适合建立索引,因为更新不单单要跟新 数据还要跟新索引,加重了IO的负担。
  • where条件里用不到的字段不创建索引。
  • 在高并发下推荐创建复合索引。
  • 查询中排序的字段,排序字段如果通过索引去访问将大大提高排序速度。
  • 查询中统计或分组字段。

10.索引失效的几种情况

  • 带头大哥不能死
  • 中间兄弟不能断
  • 索引列上无计算
  • like%加右边
  • 范围之后全失效
  • 字符串里有引号

11.索引优化

  • join语句的优化:尽可能减少join语句中的NestedLoop的循环总次数。
  • 永远用小结果集去驱动大结果集。
  • 优先优化NestedLoop的内层循环。

第三章、查询截取分析

1.查询优化

  • 永远是小表驱动大表(减少连接)。
  • 当order by 语句使用最左前列索引且使用where子句与order by子句条件列组合满足索引最左前列时,不会出现using FileSort。
  • MySQL有两种排序方法:文件排序(FileSort)与索引排序(index)。
  • 提高order by的速度的三种方式:

a.不可使用select * (容量可能超出 sort_buffer_size)。

b.提高sort_buffer_size的大小。

c.提高max_lenght_for_sort_data的大小。

2.group by 注意事项

  • group by 实质是先排序再分组,遵守最佳左前缀
  • 当无法使用索引列时,可以像order by一样增大max_lenght_for_sort_data的大小和sort_buffer_size的大小。
  • where性能高于group by ,能写在where限定条件里的尽量别用having去限定。

第四章、MySQL锁机制

1.锁的分类

  • 按操作分:(1)读锁:能读表,不可写表,其他可读。(2)写锁:写锁会阻塞其他的读写操作,不阻塞自己的读写操作。
  • 按粒度分:(1)表锁 (2)页锁 (3)行锁。

2.当session1将book表上啦读锁后,session1、session2都可以读book表,session1不可写book表,session2可进行写book表,但只能当session1释放锁后才可完成,这是阻塞状态。

3.当session1对book表加了写锁后,session1可以对book表进行读操作与写操作。但session2对book表读写操作都为阻塞状态。

4.MyISAM在执行读操作时,会自动给涉及的所有表加读锁,不会阻塞其它进程对同一个表的读请求,但会阻塞对同一表的写请求。

5.MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主的存储引擎。因为写锁以后,其它线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。

6.行锁偏向于InnoDB存储引擎,开销大,加锁慢,会出现死锁,但锁的粒度比较小,发生锁冲突的概率很低,并发度也很高。

7.并发事务带来的问题:更新丢失、脏读、不可重复读、幻读。

福利部分:

相信聪明伶俐,勤奋好学,谦虚上进,志向远大的你,一定需要它!快快关注我,把它带走,学起来吧!

mysql 左连接b表的一条数据_如果你正在找MySQL精品资源,那来这里看看相关推荐

  1. mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

    转载地址: 阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com 说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化 ...

  2. 左连接的表中有多条数据如何只取一条(最大或最小)

    表a,有字段id,表b有字段cid,create_time,a表中的id对应b表中的cid,a表左连接b表,现在a中一条数据对应b中多条数据,如何只取b表中create_time最大的一条 ? CRE ...

  3. 如何给mysql表添加百万条数据_给mysql一百万条数据的表添加索引

    直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...

  4. mysql查询每个id的前10条数据_解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据...

    我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据. 好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的 ...

  5. mysql一张表100亿条数据_一个表有100亿条记录,如何优化

    我们的数据库还在设计阶段.我们预计数据量将会很大,一年的时间里,一张表,就会产生100亿条数据,表结构,如下id,userid,createddate,等等正常情况下,100亿条记录如果都存在一个表里 ...

  6. mysql分组取出每组地一条数据_基于mysql实现group by取各分组最新一条数据

    基于mysql实现group by取各分组最新一条数据 前言: group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式. 一.准 ...

  7. 只导表前10条数据_【205期】面试官:数据量很大的情况下,对于分页查询你有什么优化方案吗?...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:公众号改版后文章顺序不固定,欢迎大家把我们面试题精选这个公众号设置为星标,感谢大家一年的支持! ...

  8. mysql查询两个表中的不同数据_如何实现大数据在多工作表中精准查询

    大家好,今日继续讲解VBA数据库解决方案,今日讲解第40讲:利用ADO实现同一文件的多个工作表精确查询.其实这讲的内容利用我之前讲解的知识点也可以自己完成.这里只是拿出来让大家再熟悉一下EXCEL的A ...

  9. mysql数据库每秒能写入多少条数据_数据库插入速度能有50W每秒吗

    写入速度 MySQL每秒可以插入50w条记录吗? 带着疑问,我们一起看看mysql每秒可以插入多少条记录? 要回答这个问题,首先要考虑影响mysql插入速度的因素有哪些? 硬盘的速度,网卡的速度,写入 ...

最新文章

  1. iOS友盟推送发送失败
  2. 文巾解题 278. 第一个错误的版本
  3. Boost:使用OpenCL和OpenCL计算直方图的代码示例
  4. 线程与进程的控制原语对比
  5. 为什么做的报表领导不满意,如何提升报表的价值?
  6. linux crontab 定时任务解析
  7. toad 连接mysql8.0_toad for mysql免费版
  8. ubuntu环境下安装opencv教程及测试
  9. Arcgis中的空间数据拓扑理论及规则
  10. cef js返回c++的代码_CEF3开发者系列之JS与C++交互之简单介绍
  11. 串口——同时打开两个串口
  12. 开源项目SMSS发开指南(四)——SSL/TLS加密通信详解
  13. Java 类加载顺序与成员变量初始化
  14. 天河一号超级计算机研究成功,超级计算机“天河一号”研制成功
  15. 【数据库】 关系模式的规范化理论----一文让你轻松理解其中奥秘
  16. 【沃顿商学院学习笔记】商业分析——People Analytics:15 人才分析 Talent Analytics
  17. 照片日历制作软件服务器端,Radicale搭建CalDAV日历服务
  18. 双系统下ubuntu16.04备份和还原、彻底删除和重装(包含迁移) 亲跳多坑!!
  19. pyqt按钮带参数点击事件
  20. h5深色模式快速适配背景和字体颜色

热门文章

  1. c++ 异步回调_知道Java中的回调机制吗?
  2. Java处理excel根据某列的值查询,并将结果显示在其他列中
  3. 如何在 Kubernetes 中对无状态应用进行分批发布
  4. 网络部署原理加实验步骤
  5. flaskr 报错及其修改
  6. Linux下如何把时间转成秒数,或把秒数转换成标准时间
  7. linux命令---查找文件中的内容
  8. 归纳整理--第2篇--QQ好友
  9. 分支1-CentOS6.5下 正/反向域名解析之yum安装/编译安装 的教程
  10. web前端研发工程师编程能力成长之路