1.存储引擎

innodb与MyIASM存储引擎的区别:
  1.innodb 是mysql5.5版本以后的默认存储引擎, 而MyISAM是5.5版本以前的默认存储引擎.
  2.innodb 支持事物,而MyISAM不支持事物
  3.innodb 支持行级锁.而MyIASM 它支持的是并发的表级锁.
  4.innodb 支持外键, 而MyIASM 不支持外键
  5.innodb与MyIASM存储引擎都采用B+TREE存储数据, 但是innodb的索引与数据存储在一个文件中,这种方式我们称之为聚合索引.
    而MyIASM则会单独创建一个索引文件,也就是说,数据与索引是分离开的
  6.在效率方面MyISAM比innodb高,但是在性能方面innodb要好一点.
2.索引
  1.普通索引 加速查询
  创建:
  create table t1(
  id int not null,
  name varchar(50),
  index idx_id (id)
  )
  通过命令创建
  CREATE index idx_name on t1(name);
  查看索引
  show index from t1;
  删除索引
  drop index ide_id on t1;

  2.唯一索引 加速查询 和 唯一约束(可含一个null 值)
  create table tb2(
  id int not null auto_increment primary key,
  name varchar(50) not null,
  age int not null,
  unique index idx_age (age)
  )

  create unique index idx_age on tb2(age);

  3.主键索引 加速查询 和 唯一约束(不可含null)

  alter table tb3 add primary key(id);

  alter table tb3 drop primary key;

  4.组合索引
  create unique index idx_age on tb2(age,name);

3. 聚合索引和辅助索引
总结二者区别:
  相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。
  不同的是:聚集索引叶子结点存放的是一整行的信息,而辅助索引叶子结点存放的是单个索引列信息.

4如何正确使用索引
  #1. 范围查询(>、>=、<、<=、!= 、between...and)
    #1. = 等号
    select count(*) from userinfo where id = 1000 -- 执行索引,索引效率高

    #2. > >= < <= between...and 区间查询
    select count(*) from userinfo where id <100; -- 执行索引,区间范围越小,索引效率越高

    select count(*) from userinfo where id >100; -- 执行索引,区间范围越大,索引效率越低

    select count(*) from userinfo where id between 10 and 500000; -- 执行索引,区间范围越大,索引效率越低

    #3. != 不等于
    select count(*) from userinfo where id != 1000; -- 索引范围大,索引效率低

  #2.like '%xx%'
  #为 name 字段添加索引
  create index idx_name on userinfo(name);

  select count(*) from userinfo where name like '%xxxx%'; -- 全模糊查询,索引效率低
  select count(*) from userinfo where name like '%xxxx'; -- 以什么结尾模糊查询,索引效率低

  #例外: 当like使用以什么开头会索引使用率高
  select * from userinfo where name like 'xxxx%';

  #3. or
  select count(*) from userinfo where id = 12334 or email ='xxxx'; -- email不是索引字段,索引此查询全表扫描

  #例外:当or条件中有未建立索引的列才失效,以下会走索引
  select count(*) from userinfo where id = 12334 or name = 'alex3'; -- id 和 name 都为索引字段时, or条件也会执行索引

  #4.使用函数
  select count(*) from userinfo where reverse(name) = '5xela'; -- name索引字段,使用函数时,索引失效

  #例外:索引字段对应的值可以使用函数,我们可以改为一下形式
  select count(*) from userinfo where name = reverse('5xela');

  #5.类型不一致
  #如果列是字符串类型,传入条件是必须用引号引起来,不然...
  select count(*) from userinfo where name = 454;

  #类型一致
  select count(*) from userinfo where name = '454';

  #6.order by
  #排序条件为索引,则select字段必须也是索引字段,否则无法命中
  select email from userinfo ORDER BY name DESC; -- 无法命中索引

  select name from userinfo ORDER BY name DESC; -- 命中索引

  #特别的:如果对主键排序,则还是速度很快:
  select id from userinfo order by id desc;

5.组合索引

组合索引: 是指对表上的多个列组合起来做一个索引.

最左匹配原则: 从左往右依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;

select * from mytable where a=3 and b=5 and c=4;
  #abc三个索引都在where条件里面用到了,而且都发挥了作用

select * from mytable where c=4 and b=6 and a=3;
  #这条语句列出来只想说明 mysql没有那么笨,where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样

select * from mytable where a=3 and c=7;
  #a用到索引,b没有用,所以c是没有用到索引效果的

select * from mytable where a=3 and b>7 and c=3;
  #a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引

select * from mytable where b=3 and c=4;
  #因为a索引没有使用,所以这里 bc都没有用上索引效果

select * from mytable where a>4 and b=7 and c=9;
  #a用到了 b没有使用,c没有使用

select * from mytable where a=3 order by b;
  #a用到了索引,b在结果排序中也用到了索引的效果

select * from mytable where a=3 order by c;
  #a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了

select * from mytable where b=3 order by a;
  #b没有用到索引,排序中a也没有发挥索引效果

6.注意事项
  1. 避免使用select *
  2. 其他数据库中使用count(1)或count(列) 代替 count(*),而mysql数据库中count(*)经过优化后,效率与前两种基本一样.
  3. 创建表时尽量时 char 代替 varchar
  4. 表的字段顺序固定长度的字段优先
  5. 组合索引代替多个单列索引(经常使用多个条件查询时)
  6. 使用连接(JOIN)来代替子查询(Sub-Queries)
  7. 不要有超过4个以上的表连接(JOIN)
  8. 优先执行那些能够大量减少结果的连接。
  9. 连表时注意条件类型需一致
  10.索引散列值不适合建索引,例:性别不适合

7.查询计划
预估查询的结果,不太精准
type : 查询计划的连接类型, 有多个参数,先从最佳类型到最差类型介绍

性能: null > system/const > eq_ref > ref > ref_or_null > index_merge > range > index > all

8.慢日志查询
将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件,
通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的。

#.查询慢日志配置信息 :
show variables like '%query%';
#.修改配置信息
set global slow_query_log = on;

# 显示参数  
show variables like '%log_queries_not_using_indexes';
# 开启状态
set global log_queries_not_using_indexes = on;

#查看慢日志记录的方式
show variables like '%log_output%';

#设置慢日志在文件和表中同时记录
set global log_output='FILE,TABLE';

#查询时间超过10秒就会记录到慢查询日志中
select sleep(3) FROM user ;

#查看表中的日志
select * from mysql.slow_log;

MySQL:数据库入门篇5的更多相关文章

  1. Jmeter测试Mysql数据库-入门篇

    一.jmter配置数据库 1.在配置jmter之前需要先安装数据库连接池驱动,进入到官方下载页面https://dev.mysql.com/downloads/connector/j/,下载对应的驱动 ...

  2. MySQL:数据库入门篇2

    #移除主键时需要先解除递增,才能解除主键 alter table info modify id int null , drop PRIMARY key 一.用户权限 1.创建用户 create use ...

  3. MySQL:数据库入门篇3

    1.sql语句逻辑执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_t ...

  4. MySQL数据库入门到高薪培训教程(从MySQL 5.7 到 MySQL 8.0)

    一.MySQL数据库入门到高薪培训视频教程(从MySQL5.7到MySQL8.0) 本套MySQL学习教程地址: https://edu.51cto.com/course/18034.html 为满足 ...

  5. MySQL数据库扫盲篇

    MySQL数据库扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.MySQL概述 1>.什么是MySQL MySQL是瑞典的MySQL AB公司开发的一个可用于各 ...

  6. MySQL数据库入门备份数据库

    MySQL数据库入门——备份数据库   一提到数据,大家神经都会很紧张,数据的类型有很多种,但是总归一点,数据很重要,非常重要,因此,日常的数据备份工作就成了运维工作的重点中的重点的重点....... ...

  7. MySQL数据库入门多实例配置

    MySQL数据库入门——多实例配置 前面介绍了相关的基础命令操作,所有的操作都是基于单实例的,mysql多实例在实际生产环境也是非常实用的,因为必须要掌握 1.什么是多实例 多实例就是一台服务器上开启 ...

  8. MySQL数据库入门常用基础命令

    MySQL数据库入门———常用基础命令      数据——公司的生命线,因此在大多数的互联网公司,都在使用开源的数据库产品,MySQL也因此关注度与使用率非常的高,所以做为运维的屌丝们,掌握它的一些基 ...

  9. MySQL数据库入门笔记

    2 数据库入门 2.1引入 数据保存到内存: 优点: 1)读写非常快 缺点: 1)程序关闭导致数据丢失 数据保存到文件: 优点: 1)数据可以永久保存 缺点: 1)频繁地IO操作,效率不高! 2)数据 ...

随机推荐

  1. 解决Resharper在Core项目中无法执行单元测试的问题

    项目升级core了,resharper最近升级到2018.1版本,但是安装后还是无法直接运行单元测试,昨天小姐姐发了解决方法,贼有用.所以记录一下,给自己以后或者其他遇到此问题的小伙伴用.  解决Re ...

  2. MongoChef

    简介 开源且免费,有商业版 可自动化生成查询语句 使用 最下面的 _id 是自动生成的,手动指定 {      .0,      "_id" : ObjectId("58 ...

  3. VI设计对于企业文化建设的重要性

    VI设计对于企业文化建设非常重要,包括企业品牌形象塑造.企业价值提炼.企业文化建设等有着非常重要的作用.VI设计的发展趋势是什么? 第一 从静态到动态 中国过去一段时间以来的VI设计,也是以一种静止和 ...

  4. CDH与原生态hadoop之间的区别(转)

    需要认识的几个问题 ------------------------------------------------------------------------------------------ ...

  5. 抓包来看ftp状态码

    1.quit退出 客户端输入退出命令: 退出的抓包数据交换过程: 2.用户登录,输入正确用户名和错误用户名都是返回331请求输入密码,这里不再将错误用户名的抓包数据交换过程截图. 数据交换过程: 服务 ...

  6. vuex中filter的使用 && 快速判断一个数是否在一个数组中

    vue中filter的使用 computed: mapState({ items: state => state.items.filter(function (value, index, arr ...

  7. 在ZYNQ-7000平台上利用PS点亮PL上的LED灯

    在ZYNQ-7000平台上利用PS点亮PL上的LED灯 1.实验方案 图1    实验方案系统框图 2.具体步骤 2.1.vivado工程建立 ①打开vivado集成开发环境,点击“Create Pr ...

  8. ife task0003学习笔记(三):JavaScript闭包

    一.this易错分析 在学习闭包的时候,有一个概念this很重要,关于this的理解,下面3种情况:this指向谁? fn.call(obj1); obj2.fn() fn() 答案是obj1 obj ...

  9. 4.爬虫 requests库讲解 GET请求 POST请求 响应

    requests库相比于urllib库更好用!!! 0.各种请求方式 import requests requests.post('http://httpbin.org/post') requests ...

  10. e.target和e.event和event.srcElement

    e.target 是目标对象,e.event是目标所发生的事件,event.srcElement捕获当前事件作用的对象 1. $(function(){ $("li:has(ul)" ...