MYSQL

一、引擎

mysql:MySQL是一个关系型数据库管理系统,其中有两种引擎最为常见MyISAM和InnoDB

MyISAM(非聚集索引)    MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务
InnoDB(聚集索引)     事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎
 
 
二、MYSQL索引:Btree索引结构。
   B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。
   btree索引:通俗点说就是一颗二叉树
     (图为百度出来的图,如有侵权,请私信告诉我。我只是为了让Btree更加浅显易懂,重点是我画得难看。TOT)
通俗得来说:如取35为节点,比35小的就放左边,比35大的就放右边。如果我们要寻找87叶子节点的位置,87比35大,所以在右边,然后87比39还大,所以还在右边,比65还大,所以还在右边,一共寻找3次。

Question

说到Btree索引,一直以来都有个通俗问题:对于hash索引,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,检索效率比Btree高很多,那为什么不用Hash索引却要用Btree索引?
Answer:
有以下几点原因:Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
        Hash 索引无法被用来避免数据的排序操作。
        Hash 索引在任何时候都不能避免表扫描。
        Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
        (hash 在mylsam数据表存储是范围存放,只按照节点查找,一旦多个hash值索引节点,那么就要在数据表多个位置寻找,比InnoDB中索引和数据在同一节点寻找复杂得多,所以不推荐hash)(括号的是我总结,不一定对。有错可以指出,我会修改)
 
三、聚集索引及其碎片维护

  (InnoDB)聚簇结构的特点:

  • 根据主键查询条目时,不用回行(数据就在主键节点下)
  • 如果碰到不规则数据插入时,造成频繁的页分裂

  为什么会产生页分裂?

这是因为聚簇索引采用的是平衡二叉树算法,而且每个节点都保存了该主键所对应行的数据,假设插入数据的主键是自增长的,那么根据二叉树算法会很快的把该数据添加到某个节点下,而其他的节点不用动;但是如果插入的是不规则的数据,那么每次插入都会改变二叉树之前的数据状态。从而导致了页分裂。

  优化:

聚簇索引的主键值,应尽量是连续增长的值,而不是要是随机值, (不要用随机字符串或UUID),否则会造成大量的页分裂与页移动。在使用InnoDB的时候最好定义成:

id int unsigned primary key auto_increment

索引选择性与前缀索引

因为索引虽然加快了查询速度,但索引也是有代价的,另外,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好。

一般两种情况下不建议建索引。
1.表记录比较少,超过2000条可以酌情考虑索引。
2.索引的选择性较低。所谓索引的选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:
Index Selectivity = Cardinality / #T

显然选择性的取值范围为(0, 1],选择性越高的索引价值越大,这是由B+Tree的性质决定的。

使用索引扫描来优化排序条件
1.索引的列顺序和Order by子句的顺序完全一致
2.索引中所有列的方向(升序,降序)和Order by子句完全一致
3.Order by中的字段全部在关联表中的第一张表中

 四、MYSQL 优化命令查询

1、查版本号

无论做什么都要确认版本号,不同的版本号下会有各种差异。

>Select  version();

 

2、执行状态分析

显示哪些线程正在运行

>show processlist;   (端口号给我马赛克了,见谅见谅,安全起见)

 

3、Show profile

精确两位数,小数点。

show profile默认的是关闭的,但是会话级别可以开启这个功能,开启它可以让MySQL收集在执行语句的时候所使用的资源。

分析SQL执行带来的开销是优化SQL的常用手段,在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。
它只能在session级别来设置,设置后影响当前session;当它开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文,CPUMEMORY等。

开启profiling,有个警告,这个参数在以后会被删除,用information_scheam.PROFILING替代。

  (设置profiling=1,开启profile)

  (使用命令:show profile 观看执行时间,15行受影响)

根据query id查看某个查询得详细时间耗时。

Explain的列分析

如查询语句:

查询语句是explain select * from goods order by goods_id asc \G

 

 

 

Mysql(MyISAM和InnoDB)及Btree和索引优化的更多相关文章

  1. mysql myisam转innodb的2种方法

      mysql myisam转innodb的2种方法 mysql中的myisam和innodb有什么区别.一个好比便利店,一个好比大型购物中心,他们是为了适应不同的场合而存在的.当流量比较小,我们可以 ...

  2. 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点、主程面试常问问题详解

    本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路". 学习知识最好的方式是带着问题去研究所 ...

  3. 深入浅出分析MySQL MyISAM与INNODB索引原理、优缺点分析

    本文浅显的分析了MySQL索引的原理及针对主程面试的一些问题,对各种资料进行了分析总结,分享给大家,希望祝大家早上走上属于自己的"成金之路". 学习知识最好的方式是带着问题去研究所 ...

  4. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  5. Mysql MyISAM与InnoDB 表锁行锁以及分库分表优化

    一. 两种存储引擎:MyISAM与InnoDB 区别与作用 1. count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需 ...

  6. MyISAM和innoDB对比,覆盖索引简单回顾

    MyISAM Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam. 它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以 ...

  7. MySql MyISAM和InnoDB的区别

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法. ...

  8. MySQL MyISAM和InNodb备份与恢复技巧

    1. 为什么要备份数据库 对数据库来说,最重要也最容易被忽视的就是备份.由于不可预测性,偶然的事件可能会导致非常惨重的损失. 数据越是重要,数据的变化越频繁,备份越发需要经常进行. 备份周期根据不同业 ...

  9. MySQL MyISAM和Innodb表生成序列

    目录 背景 分析 测试 结论 背景 应用端需要生成依次递增的序列来做流水序号等,方案有1.redis /MySQL SEQUENCE引擎生成序列:2.MySQL中myisam表 replace int ...

随机推荐

  1. element ui中dialog相关问题

    一,今天需要在dialog里面引入另一个页面,就是打开dialog显示该页面(把页面放到dialog中),引入的语句如下: <iframe src="view?path=rkdj_b& ...

  2. SQLServer: 解决“错误15023:当前数据库中已存在用户或角色”

    首先介绍一下sql server中“登录”与“用户”的区别,“登录”用于用户身份验证,而数据库“用户”帐户用于数据库访问和权限验证.登录通过安全识别符 (SID) 与用户关联.将数据库恢复到其他服务器 ...

  3. javascript-关于赋值的那点事

    var ary1=[3,4]; var ary2=ary1; ary2[0]=1; ary2=[6,5] console.log(ary1) console.log(ary2) 个人测试出的结果是:更 ...

  4. WebBrowser常用属性方法介绍

    WebBrowser 常用属性方法 ■■方法 ==============================  ▲GoBack    相当于IE的"后退"按钮,使你在当前历史列表中后 ...

  5. PHP unset()函数销毁变量

    <?php // 销毁单个变量 unset ($var); // 销毁单个数组元素 unset ($arr['a']); // 销毁多个变量 unset ($var1, $var2, $var3 ...

  6. Java 9 - Java Number类

    Java Number类 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double等. 实例 int i = 5000; float gpa = 13.65 ...

  7. Windows把内存变成快速虚拟硬盘

    笔记本电脑安装了8G内存,却装了个Win7 32位系统,结果只能识别2946MB内存,还有5GB多内存白白浪费了,那个闹心啊,别提多不爽,听说能把内存虚拟成硬盘使用,用它缓存系统临时文件,以及缓存网页 ...

  8. 使用路由和远程访问服务为Hyper-V中虚拟机实现NAT上网

    众所周知,在微软的Hyper-V环境中的网络环境中没有VMware Workstation中的NAT功能,所以Hyper-V环境中虚拟机上网一般情况下需要通过设置为外部网络方可访问网络,当然也可设置为 ...

  9. python 27 获取时区转换后的时间

    python3的datetime有timezone属性,这里介绍python2.7环境下,获取时区转换后的时间. 利用第三方插件,pytz,没有安装的话安装一下. #!/usr/bin/env pyt ...

  10. appium运行时每次默认弹出appiumsetting与unlock重装,关闭这两个步骤的方法

    找到appium安装目录,可以在 appium 源码里(C:\Program Files (x86)\Appium\node_modules\appium\lib\devices\android)注释 ...