倒数第二天!冲冲冲!!!

一、索引

一个表里面可以有多个索引。

1. 索引的作用:约束与加速查找

  无索引:从前到后依次查找

  有索引:会为索引列创造一个额外文件(以某种格式存储)。在使用索引进行查找时,会优先在该文件里面进行查找,所以查询时很快。——因此也会占据硬盘的空间。

  不足:索引查询快,但是对索引进行更新和删除时慢。

  命中索引:对索引的正确引用才能加速查找。 select * from student where sid = 1

2. 索引类型

某种格式——   

  hash索引:索引表。在索引表中将数据以“哈希值”进行存储,同时保存该数据存储地址。需要注意的是,在索引表中,哈希值的排列顺序与原来表中的数据顺序是不一样的。

  缺点:因此在hash表中如果查找where id > 3 之类的数据,即使id列为索引列,其查找速度在大数据的情况下也会变慢,因为hash中的排列时无序的,不能一顺溜的取出来。简而言之,查找连续的数值很慢。

  优点:查找单值速度非常快。

  btree索引(常用):将值转化为数字,以二叉树的形式进行存储(按顺序存储)。——(在innodb中使用的是btree)

  a. 普通索引:加速查找(没有唯一性的限制)

   创建索引: create index ix_name on tiny_data<email> (ix_name为索引名称)

   删除索引: drop index ix_name on tiny_data

   查看索引: show index from tiny_data;

   在创建表时创建索引:

create table in1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
index ix_name (name)
)

创建表+索引

      对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length: create index ix_extra on in1(extra(32))

  b. 主键索引:加速查找+不能为空+不能重复 (就是创建时的primary key)

   在建表之后创建主键索引:  alter table 表名 add primary key(列名)

  c. 唯一索引:加速查找+不能重复(可以为空)

   创建索引: create unique index 自定义索引名称 on 表名(列名) (就是多加个unique)

      删除索引: drop 自定义索引名 on 表名

      在创建表同时创建索引:(注意此时关键词是 unique 不是 unique index)

create table in1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
unique ix_name (name)
)

创建表+索引

  d. 组合索引(多列组合成一个索引):联合普通索引,联合主键索引,联合唯一索引

   创建索引:  create unique index 自定义索引名称 on 表名(列名,列名)

      删除索引:  drop 自定义索引名 on 表名

      最左前缀匹配:假设 设立sid 与 sname 都是 student 表的索引。 create index ix_sid_sname on student(sid, name)

select * from student where sid = 1;                         -- 可以在索引文件中执行,使用索引
select * from student where sid = 1 and sname = "alex"; -- 可以在索引文件中执行
select * from student where sname = "alex"; -- 不可以在索引文件中执行

3. 索引补充

(1)覆盖索引:(名词解释)在索引文件中可以直接获取数据(指索引值)。如  select sid from student where sid = 1  (在sid为student表的索引的情况下)。

(2)索引合并:(名词解释)把多个单列索引合并使用。如  select sid, sname from student where sid = 1 and sname = 'alex  (在sid与sname都是索引的情况下)。不过虽然“索引合并”使用起来比“联合索引”方便,但是“联合索引”效率更高。

二、命中索引(重点***)

索引内容参考——武沛齐博客

1. 正确使用索引

(1)避免使用“%like%”语句进行查询,因为速度非常慢。

解决办法:使用第三方工具,搜集分词结果并存储该分词所在ID(索引),在查询时程序会优先在第三方工具的分析结果中进行查询,获取ID后再使用索引查询。

(2)避免使用函数

(3)or:查询条件是(索引列 or 非索引列)的组合时,会导致索引失效。

(4)类型不一致:如果列是字符串类型,传入条件时必须用引号引起来,否则会执行一个类型转换过程,使查询速度变慢。

(5)普通索引使用“!=”进行查询时,无法命中索引,即没有使用索引查询。Especially, 主键除外,如果是对主键使用“!=”进行查询,还是会使用索引进行查询。

普通索引使用“>”进行查询时,无法命中索引,即没有使用索引查询。Especially, 如果是主键或索引是整数类型,则还是会走索引。

“order by” 当根据索引排序时候,选择的映射如果不是索引,则不走索引。如 select email from tb1 order by name desc; 。Especially, 如果对主键排序,则还是走索引。

2. 其他注意事项(1,2,3,9最基础)

(1)避免使用select *

(2)count(1)或count(列)代替count(*)

(3)创建表时尽量时 char 代替 varchar

(4)表的字段顺序固定长度的字段优先

(5)组合索引代替多个单列索引(经常使用多个条件查询时)

(6)尽量使用短索引。可以创建局部索引

create index ix_name on tb1(title(16))
-- 表示用title的前16个字符做索引

(7)使用连接(JOIN)来代替子查询(Sub-Queries)——不过这个在MySQL中是一样的,在SQLServer中有差别

(8)连表时注意条件类型需一致

(9)引散列值(重复少)不适合建索引,例:性别

三、MySQL执行计划

执行计划:让MySQL预估执行操作需要的时间。

#输入,假设索引是(id, email)
explain select * from tiny_data; --没有走索引(all)
explain select * from tiny_data where id = 3; -- 主键索引(const)
explain select * from tiny_data where email = "alex@qq.com"; -- 普通索引(ref)

预估时间判断——查看type(仅供参考)

type:all(全表扫描)——没有走索引,速度很慢

     const(走了主键索引)——速度很快

   ref(走了索引)——速度很快

 查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

四、DBA工作

1. 慢日志:在服务端进行设置

    a.执行时间过慢,如大于10秒

    b.未命中索引

    将以上记录记录到指定的日志文件路径。

2. 配置

  (1)基于内存

  查看当前配置信息: show variables like '%query%'

  在配置信息的结果中重点关注:

slow_query_log = OFF                              -- 是否开启慢日志记录
long_query_time = 2 -- 时间限制,超过此时间,则记录
slow_query_log_file = /usr/slow.log -- 日志文件路径
log_queries_not_using_indexes = OFF -- 为使用索引的搜索是否记录

  修改当前配置: set global 变量名 = 值

  (2)基于配置文件

  a. 自建配置文件:在启动服务端的时候设置配置文件路径,mysql慢日志就会使用配置文件中的配置

   mysqld --defaults-file='D:\my.conf'

  b. 在已有的自带的配置文件下进行更改(my-default.ini)。(我没有找到这个文件,,,)

  ps:修改配置文件后,需要重启服务。(在修改前记得备份,如果修改后出了问题,可以还原)

五、MySQL分页性能相关方案(重点***)

limit分页时,如(limit 30,10),是先扫描40条数据,再取最后十条,所以越往后,需要扫描的数据量越大,会越慢。

解决方案:

1. 设定允许查询的页数

2. a.从索引表中进行扫描,实行覆盖索引 b. 从覆盖索引中查找 (下面这个mysql用不了)

select * from tiny_data where id in (           -- 利用索引进行查找
select id from tiny_info limit 20000, 10 -- 覆盖索引
)

3. 最优方案(单纯基于数据库的最优操作):

  记录当前页的最大与最小id(假设每页记录条数为10)

  (1)上一页/下一页

#min_id, max_id
-- 下一页
SELECT * FROM userinfo3 WHERE id > max_id limit 10
-- 上一页
SELECT * FROM userinfo3 WHERE id < min_id ORDER BY id desc limit 10

  (2)跳转型:上一页 192 193 194 【195】 196 197 198 下一页

SELECT * FROM userinfo3 WHERE id in (
(SELECT * FROM userinfo3 WHERE id > max_id limit 30) as N ORDER BY N.id DESC LIMIT 10
)
-- 这么讲了一通,理解了大致操作,但是没有实操

MySQL学习笔记(五)的更多相关文章

  1. mysql学习笔记五 —— MHA

    MySQL_MHA ABB(主从复制)-->MHA(实现mysql高可用.读写分离.脚本控制vip飘逸)-->haproxy(对slave集群实现分发,负载均衡)-->keepali ...

  2. MySQL学习笔记五:数据类型

    MySQL支持多种数据类型,大致可以分为数值,日期/时间和字符类型. 数值类型 MySQL支持所有标准SQL数值数据类型,包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUM ...

  3. MySql学习笔记(五) —— 存储过程

    存储过程是MySql 5支持的特性,它是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之 ...

  4. MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  5. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  6. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  7. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  8. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

  9. MySQL学习笔记-大纲

    软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...

  10. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

随机推荐

  1. 2021年的十五个DevOps趋势预测

    DevOps已经走过了很长的一段路,毫无疑问,它将在今年继续闪耀.由于许多公司都在寻找围绕其数字化转型的最佳实践,因此了解领导者认为该行业的发展方向非常重要.从这个意义上说,下面的文章收集了DevOp ...

  2. docker(1)下载安装for mac

    前言 Docker 提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D ...

  3. Java正则表达式解析网页源码

    <!DOCTYPE html> <html lang="zh-Hans"> <head> <meta charset="utf- ...

  4. P4254 [JSOI2008]Blue Mary开公司 (李超树)

    题意:插入一些一次函数线段 每次询问在x = x0处这些线段的最大值 题解:李超树模版题 维护优势线段 注意这题的输入是x=1时的b #include <iostream> #includ ...

  5. Educational Codeforces Round 9 C. The Smallest String Concatenation(字符串排序)

    You're given a list of n strings a1, a2, ..., an. You'd like to concatenate them together in some or ...

  6. Codeforces Round #529 (Div. 3) D. Circular Dance (思维)

    题意:有\(n\)个熊小孩,绕着树转圈圈,编号\(i\)的小孩可以记住\(a_{i,1}\)和\(a_{i,2}\)两个小孩,这两个小孩是顺时针相邻的,但谁前谁后不一定.现在给你每个小孩的\(a_{i ...

  7. .net core 更换yum源 / “No package libgdiplus-devel available.” 错误解决方法

    安装 libgdiplus-devel yum install libgdiplus-devel 如果出现错误 No package libgdiplus-devel available. 原因可能是 ...

  8. 正则指引 pdf 高清版

    链接:https://pan.baidu.com/s/1Xeuma4toE_L-MxROvTGBxw 提取码:nqyj

  9. ES中文分词器安装以及自定义配置

    之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了. ik分词 ...

  10. windows常用快捷键和dos命令

    windows常用快捷键 Ctrl+C (复制) Ctrl+V (粘贴) Ctrl+S (保存) Ctrl+A (全选) Ctrl+Z (撤销) Alt+F4 (关闭当前窗口) shift+Delet ...