美文网首页
mysql数据库sql优化

mysql数据库sql优化

作者: 我是啵啵 | 来源:发表于2019-11-25 11:12 被阅读0次

    mysql数据库管理系统(DBMS)

    初始化模块自动给我们生成3个数据库

    • mysql
    • perfomance schema
    • information schema
      连接管理
      分配给进程模块
      要求登陆
      执行命令
      分发

    真正的数据库就是对应了一个一个的文件

    结构图

    下面是

    存储引擎

    不同的机构去写这个开源的东西

    • 如何存数据
    • io读取方式

    引擎介绍

    • isam: 读取快 不支持容错 没有事务
    • myisam:
      查的快
      如果使用该数据库引擎,会生成三个文件: .frm:表结构信息 .MYD:数据文件 .MYI:表的索引信息
    • innodb:
      上面两个不支持外键和事务
      而innodb 支持 mysql 5.5 默认引擎
      InnoDB
      在 MySQL5.7 版本中,InnoDB 存储引擎管理的数据文件 为两个:分别是 frm(索引),idb(表和数据) 文件。
      特 点 :
      1 )、 支 持 事 务
      2 )、 数 据 多 版 本 读 取 ( InnoDB+MyISAM+ISAM
      3 )、 锁 定 机 制 的 改 进
      4 )、 实 现 外 键

    innodb 与 myisam 区别

    1.1.InnoDB 支持事务
    2.InnoDB 支持外键
    3.InnoDB 是聚集索引 ,(数据文件是和索引绑在一起) 用blance 树
    必须要有主键,
    MyISAM 是非聚集索引,数据文 件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

    1. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描

    memory 存储引擎

    存在内存中 只有一个表结构是存在磁盘上

    存储引擎的管理命令

    查看数据库支持的存储引擎
    show engines

    就是默认引擎是什么。
    show variables like'%storage_engine%'
    也可以在 MySQL 配置文件中查看。 windows-my.ini。 Linux-my.cnf

    show create table user;
    可以建表时指定引擎
    engin=myisam
    可修改

    配置文件
    里面有什么表信息 配置信息
    C:\ProgramData\MySQL\MySQL Server 5.7\Data

    mysql索引

    适合建立索引

    第一、在经常需要搜索的列上;
    第二、在作为主键;
    第三、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
    第四、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; (between)
    第五、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的 排序;
    第六、在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。 建立索引,一般按照 select 的 where 条件来建立,比如: select 的条件是 wheref1and f2,那么如果我们在字段 f1 或字段 f2 上建立索引是没有用的,只有在字段 f1 和 f2 上同时 建立索引才有用等。

    实例

    比如用户名 ,id这种经常用的就是作为查询条件适合建索引
    性别不经常查询就不适合建立
    比如性别 不适合 因为结果集太大
    修改大于检索就不适合创建索引

    常用索引

    blance tree

    广度尽可能地大深度尽可能地少
    B-tree 中,每个结点包含:
    1、本结点所含关键字的个数;
    2、指向父结点的指针;
    3、关键字;
    4、指向子结点的指针;

    关键字存在一个平衡二叉树中

    full-text

    全文索引 特殊的b树 abc
    a
    ab
    abc
    只有左边 称为最左查找 "xxx%" 只能解决这种

    索引的管理

    • 普通索引
      新建索引
      CREATE INDEX inname onuser(PASSWORD(10));
      查看索引
      show INDEX fromuser; user 是表名
      删除
      DROP INDEXinnameonuser;

    • 唯一索引:
      索引的列值必须唯一 但是可以为空

    • 全文索引
      只能是char varchar text 这些列
      大容量的表 需要先将 数据录入进表 再建立索引

    • 组合索引 符合最左前缀
      CREATETABLEarticle(idintnotnull,titlevarchar(255),timedate);
      ALTERTABLE articleADDINDEXindex_title_time(title(50),time(10));
      会创建两个索引
      –title,time
      –title
      策略

    • 避免全表扫描 再where orderby 上面建立 索引

    • 避免判断空值 设置默认值 然后比较是否是那个值 空值导致 索引失效

    • 避免不等值判断

    • 避免使用 or 逻辑

    • 慎用 in 和 notin 逻辑

    • 注意模糊查询
      如果头匹配是必要逻辑,建议使用全文搜索引擎(Elasticsearch、 Lucene、Solr 等)。

    • 避免查询条件中字段计算 就是where 左边不要有运算

    mycat

    • 主从备份
    • 读写分离
    • 集群搭建
    • 负载均衡策略

    相关文章

      网友评论

          本文标题:mysql数据库sql优化

          本文链接:https://www.haomeiwen.com/subject/mtgtictx.html