• day 41 mysql索引以及前端的简介


    一 . 索引介绍

      为什么要有索引:一般的应用系统,读写比列在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易的问题,查询语句的优化显然是重中之重,说起加速查询,就要提到索引了!

      索引在MySQL中也叫“键”或者“key”(primary key unique key,还有一个index key),是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响越发重要,减少io次数,加速查询。索引优化应该是对查询性能优化最有效的手段了,索引能轻易将查询性能提高号几个数量级,索引相当于字典的音序表。

      一旦为表创建了索引,以后的查询最好先查索引,再根据索引定位的结果去找数据。索引是应用程序设计和开发的一个重要方面,若索引太多,应用程序的性能可能会收到影响。

      索引的影响:1.在表中有大量数据的前提下,创建索引速度会很慢,2.在索引创建完毕后,对表的查询性能会发幅度提升,但是写性能会降低。

      索引的本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

    二 . 索引的数据结构

      索引的数据结构跟树是差不多的,树根到树枝在到树叶,见下图:

      

      索引的两个特性:1.索引字段要尽量的小  2.索引的最左匹配特性。

    三 . 聚集索引与辅助索引

      1.在数据库中,B+树的高度一般都在2~4层,也就是说查找某一个键值的行记录时最多只需要2到4次IO,一般的机械硬盘每秒至少可以左100次IO,2~4次的IO意味着查询事件只需要0.02~0.04秒。

      数据库中B+树索引可以分为聚集索引和辅助索引,聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。

      聚集索引与辅助索引不同的是:叶子结点存放的是否是一整行的信息。

      聚集索引的好处之一:它对主键的排序查找和范围查找速度非常快,叶子节点的数据就是用户所要查询的数据。如用户需要查找一张表,查询最后的10位用户信息,由于B+树索引是双向链表,所以用户可以快速找到最后一个数据页,并取出10条记录  

      聚集索引的好处之二:范围查询(range query),即如果要查找主键某一范围内的数据,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可

      2.辅助索引:简单来说就是帮助,辅助你来索引的,举例来说,如果在一棵高度为3的辅助索引树种查找数据,那需要对这个辅助索引树遍历3次找到指定主键,如果聚集索引树的高度同样为3,那么还需要对聚集索引树进行3次查找,最终找到一个完整的行数据所在的页,因此一共需要6次逻辑IO访问才能得到最终的一个数据页。

    四 . mysql 索引管理

      1. 索引的功能就是快速查找,看看mysql常用的索引  

    普通索引INDEX:加速查找

    唯一索引:
    -主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
    -唯一索引UNIQUE:加速查找+约束(不能重复)

    联合索引:
    -PRIMARY KEY(id,name):联合主键索引
    -UNIQUE(id,name):联合唯一索引
    -INDEX(id,name):联合普通索引

      索引的两大类型hash与btree

    #我们可以在创建上述索引的时候,为其指定索引类型,分两类
    hash类型的索引:查询单条快,范围查询慢
    btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

    #不同的存储引擎支持的索引类型也不一样
    InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
    MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
    Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
    NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
    Archive 不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;

      2 . 创建/删除索引的语法

       

    #方法一:创建表时
      CREATE TABLE 表名 (
    字段名1 数据类型 [完整性约束条件…],
    字段名2 数据类型 [完整性约束条件…],
    [UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
    [索引名] (字段名[(长度)] [ASC |DESC])
    );


    #方法二:CREATE在已存在的表上创建索引
    CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
    ON 表名 (字段名[(长度)] [ASC |DESC]) ;


    #方法三:ALTER TABLE在已存在的表上创建索引
    ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
    索引名 (字段名[(长度)] [ASC |DESC]) ;

    #删除索引:DROP INDEX 索引名 ON 表名字;

    #方式一
    create table t1(
    id int,
    name char,
    age int,
    sex enum('male','female'),
    unique key uni_id(id),
    index ix_name(name) #index没有key
    );


    #方式二
    create index ix_age on t1(age);

    #方式三
    alter table t1 add index ix_sex(sex);

    #查看
    mysql> show create table t1;
    | t1 | CREATE TABLE `t1` (
    `id` int(11) DEFAULT NULL,
    `name` char(1) DEFAULT NULL,
    `age` int(11) DEFAULT NULL,
    `sex` enum('male','female') DEFAULT NULL,
    UNIQUE KEY `uni_id` (`id`),
    KEY `ix_name` (`name`),
    KEY `ix_age` (`age`),
    KEY `ix_sex` (`sex`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    五 . 测试索引

      准备过程:

    #1. 准备表
    create table s1(
    id int,
    name varchar(20),
    gender char(6),
    email varchar(50)
    );

    #2. 创建存储过程,实现批量插入记录
    delimiter $$ #声明存储过程的结束符号为$$
    create procedure auto_insert1()
    BEGIN
    declare i int default 1;
    while(i<3000000)do
    insert into s1 values(i,'egon','male',concat('egon',i,'@oldboy'));
    set i=i+1;
    end while;
    END$$ #$$结束
    delimiter ; #重新声明分号为结束符号

    #3. 查看存储过程
    show create procedure auto_insert1G

    #4. 调用存储过程
    call auto_insert1();

       在没有索引的前提下测试数值大的查询速度是相对较慢的,因为mysql不知道有多少个等于它的数据,所以要挨个的去扫描一遍。

    六 . 正确使用索引

       首先,我们创建索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们必须要遵循1.范围一定要明确 ,不能模糊查找的数据,否则找不到2.一定要等于,不可以大于或者小于还有不等于3.尽量选择区分度高的列作为索引

    七 . 联合索引

      联合索引指对表上的多个列合并起来左一个索引,省的你查询的时候,where后面的条件字段一直再变,你就想给每个字段加索引的尴尬问题

    mysql> create table t(
    -> a int,
    -> b int,
    -> primary key(a),
    -> key idx_a_b(a,b)
    -> );
    Query OK, 0 rows affected (0.11 sec)

    详情见博客:https://www.cnblogs.com/clschao/articles/10049133.html

    八 . 前端CSS的简单介绍

      数据库的知识也大概说完了,今天简单接触到了前端的知识,下面是我整理的内容

      前端CSS定义如何显示HTML元素,给HTML设置样式,让它更加美观,当浏览器读到一个样式表,它就会按照这个样式来对文档进行格式化(渲染)。

      CSS注释:/*这是注释*/

      CSS的引入方式:

      1.行内样式

      <p style="color: red">Hello world.</p>

      2.内部样式  

    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    p{
    background-color: #2b99ff;
    }
    </style>
    </head>

      3.外部样式

    <link href="mystyle.css" rel="stylesheet" type="text/css"/>  #现在写的这个.css文件是和你的html是一个目录下,如果不是一个目录,href里面记得写上这个.css文件的路径

      

  • 相关阅读:
    mysql子查询不支持limit问题解决
    mysql在把子查询结果作为删除表中数据的条件,mysql不允许在子查询的同时删除原表数据
    mysql多表删除指定记录
    px、em、rem、%、vw、vh、vm这些单位的区别
    golang 使用 gRPC
    golang 实现定时任务 cron
    golang 配置文件解析神器--viper
    GO语言异常处理机制
    分析源码理解GO语言文件操作
    用python刷算法--堆排序算法
  • 原文地址:https://www.cnblogs.com/liuteacher/p/10109437.html
Copyright © 2020-2023  润新知