mysql数据库sql优化

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优化)