zoukankan      html  css  js  c++  java
  • MySQL的基础、开发和优化

    数据库MySQL的基础、开发、优化笔记

    一、基础

    1.SQL基础

    DDL: data definition language (数据定义语言)

    -- 数据库的基本操作
    create database test1;
    show databases;
    use test1;
    drop database test1;
    -- 数据表的基本操作
    show tables;
    create table tablename(col_name1 col_type_contraints
                          col_name2 col_type_contraints)
    -- 得到数据表的详细信息
    desc tablename;
    show create table tablename G;
    -- 修改表
    alter table tablename modify col_name1 new_col_type_contraints;
    alter table tablename rename new_tablename;
    

    DML: data manipulation language (数据操纵语句)

    • 插入insert、更新update、删除delete、查询select

    CRUD(create,retrive,update,delete)

    -- 插入记录
    insert into tablename(field1,field2,field3) values(value1,value2,value3);
    insert into tablename(field1,field2,field3) values(value1,value2,value3),(val1,val2,val3);
    -- 更新记录
    update tablename set filed1=value1,field2=value2 [where condition];
    -- 删除记录
    delete from tablename where condition;
    delete from tablename where filed1='value1';
    -- 查询
    select * from tablename [where condition];
    -- distinct关键字保证记录不重复
    select distinct field from tablename;
    -- 条件查询 where condition
    -- 排序限制 order by、desc、asc
    -- 显示限制 limit offset count;
    
    • 聚合 aggregation
    • 表连接: 左连接 left join、右链接 right join
    • 记录联合 union

    DCL: data control language (数据控制语句)

    • 管理系统中的对象权限时使用

    查找操作语法,函数

    • 操作语法
    • 字段类型的取值范围
    • 版本支持函数
    • 函数功能
    ? contents
    
    mysql> help contents
    You asked for help about help category: "Contents"
    For more information, type 'help <item>', where <item> is one of the following
    categories:
       Account Management
       Administration
       Components
       Compound Statements
       Contents
       Data Definition
       Data Manipulation
       Data Types
       Functions
       Geographic Features
       Help Metadata
       Language Structure
       Plugins
       Storage Engines
       Table Maintenance
       Transactions
       User-Defined Functions
       Utility
       
       
    ? data types
    
    mysql> ? data types
    You asked for help about help category: "Data Types"
    For more information, type 'help <item>', where <item> is one of the following
    topics:
       AUTO_INCREMENT
       BIGINT
       BINARY
       BIT
       BLOB
       BLOB DATA TYPE
       BOOLEAN
       CHAR
       CHAR BYTE
       DATE
      
    
    

    2.MySQL数据类型

    2.1数值类型

    • 整数类型
    TINYINT      --字节数  1
    SMALLINT     --字节数  2
    MEDIUMINT    --字节数  3
    INT INTEGER  --字节数  4
    BIGINT       --字节数  8
    
    • 浮点数类型
    FLOAT        --字节数  4
    DOUBLE       --字节数  4
    
    • 定点数类型
    DEC(M,D)      --字节数M+2
    DECIMAL(M,D) 
    
    • 位类型
    BIT(M)        --字节 1~8
    

    2.2日期时间类型

    • 时间和日期
    DATE         -- 字节 4   年月日
    DATETIME     -- 字节 8   年月日时分秒
    TIMESTAMP    -- 字节 4   时间戳?
    TIME         -- 字节 3   时分秒
    YEAR         -- 字节 1   年
    

    2.3字符串类型

    字符数据的存储类型

    CHAR 
    VARCHAR
    TINYBLOB
    BLOB
    MEDIUMBLOB
    LONGBLOB
    TINYTEXT
    TEXT
    MEDIUMTEXT
    LONGTEXT
    VARBINARY
    BINARY
    

    3.MySQL中运算符

    运算符用来连接表达式的项

    3.1算术运算符

    • /
    • %

    3.2比较运算符

    =
    !=
    BETWEEN          -- 存在指定范围
    IN
    IS NULL
    IS NOT NULL
    LIKE
    REGEXP RLIKE     -- 正则表达式匹配
    

    3.3 逻辑运算符

    逻辑运算符也称为布尔运算符

    NOT !
    AND &&
    OR ||
    XOR 
    

    位运算符

    &   与
    |  或
    ^   异或
    ~  取反
    >>  右移
    <<  左移
    

    4.常用函数

    4.1字符串函数

    CONCAT(S1,S2)
    INSERT(str,x,y,instr)
    LOWER(str)
    UPPER()
    LEFT()
    RIGHT()
    LPAD(str,n,pad)  --用字符串pad对str最左边进行填充,直到长度为n的字符长度
    RPAD(str,n,pad) 
    LTRIM(str)       --去掉字符串str左侧的空格
    RTRIM(str)       --去掉字符串str右侧的空格
    REPEAT(str,x)
    REPLACE(str,a,b) --字符串b替换字符串str所有出现的字符串a
    STRCMP(s1,s2)
    TRIM(str)        --去掉字符串行尾和行头的空格
    SUBSTRING(str,x,y)      --返回从字符串str x位置起y个字符长度的字串
    

    4.2数值函数

    ABS(X)
    CEIL(X)     -- 返回大于x的最小正整数
    FLOOR(X)    -- 返回小于x的最大整数值
    MOD(X)
    RAND()
    ROUND(X,Y)
    TRUNCATE(X,Y)    --返回数字x截断为y位小数的结果
    

    4.3流程函数

    IF(value,t f)
    IFNULL(value1,value2)
    CASE WHEN[VALUE] THEN[result] ..ELSE[default] END
    CASE[expr] WHEN [value] THEN[result] 
    

    4.4常用函数

    DATABASE()    -- 数据库名
    VERSION()     -- 数据库版本
    USER()        -- 当前登录的用户名
    INET_ATON(ip)  -- 将ip地址转换为数字表示
    INET_NTOA(num) -- 返回数字代表的ip地址
    PASSWORD(str)  -- 返回字符串str的加密版本
    MD5(str)       -- 返回字符串str的md5值
    

    二、开发

    1.表类型(存储引擎)的选择

    针对不同存储需求可以选择最优的存储引擎

    • MyISAM
    • InnoDB 事务安全表
    engine support comment transactions xa savepoints
    MyISAM YES MyISAM storage engine NO NO NO
    InnoDB YES YES YES YES

    1.1 InnoDB存储引擎

    InnoDB是默认事务型存储引擎

    默认的级别是 可重复读,在可重复读隔离的级别下采用多版本并发控制MVCC间隙锁Next-Key Locking 来防止幻影读。

    还支持真正的在线热备份,索引自增长列(auto_increment)

    -- 可以在创建表的时候为主键  添加AUTO_INCREMENT
    -- 也可以通过修改表来实现
    ALTER TABLE *** AUTO_INCREMENT=n;
    

    提供了真正的提交、回滚和崩溃恢复能力的事务安全

    1.2 MyISAM存储引擎

    设计简单,对于数据量小、只读的数据表可以使用

    不支持事务,不支持行级锁,只能对整张表加锁(共享锁、排它锁)

    支持压缩表空间数据索引

    create table tablename(
      i bigint(20) not null auto_increment,
      primary key (i)
    )engine=MyISAM DEFAULT CHARSET=gbk;
    
    alter table tablename engine=innodb;  -- 可以实现存储引擎的修改
    

    2.数据类型选择

    2.1 CHAR、VARCHAR

    char是定长字符类型,varchar是可变长度字符类型

    通常情况下建议使用varchar,使用varchar来最小化需要处理的数据行的存储总量和磁盘I/0是比较好的。

    2.2 TEXT、BLOB

    text和blob用来保存比较大的文本

    text只能保存字符数据,bolb可以保存二进制数据、例如照片

    2.3 浮点数和定点数

    浮点数一般用于表示含有小数部分的数值

    定点数可以更精确的保存数据(实际上以字符串形式存放)

    Java中使用BigDecimal类实现定点数的精确计算

    3.字符集

    字符集就是一套文字符号及其编码、比较规则的集合

    uft-8

    4.索引的设计和使用

    索引是数据库用来提高性能的最常用工具,可以快速找出某个列中有一特定值的行

    存储引擎的表默认都是BTREE索引

    三、优化

    sql语句成为整个系统性能的瓶颈,对他们进行优化

    使用sakila模版数据库来实现优化 sakila下载地址

    • sakila-schema.sql 数据库中表的创建
    • sakila-data.sql 数据灌入
    • sakila.mwb mysql的workbench数据模型

    1.优化sql的一般步骤

    • 1.show status了解各种sql的执行效率
    show status like 'Com_%'
    -- Com_select,执行 增删改查 操作的次数
    -- Com_insert
    -- Com_update
    -- Com_delete
    -- Com_commit,了解事物提交和回滚的情况
    -- Com_rollback
    -- Connections,连接mysql服务器的次数
    -- Uptime,服务器工作时间
    
    • 2.定位执行效率低的sql语句
    -- Slow_queries,慢查询的次数
    通过查询日志定位那些执行效率较低的SQL语句
    show processlist  -- 查看当前正在执行的线程
    
    • 3.EXPLAIN分析低效SQL的执行计划
    select_type,有simple表、primary主查询、union、subquery等
    访问类型type
    type: ALL,INDEX,RANGE,ref,eq_ref,const/system,null
    type类型向右效率不断提高
    
    
    • 4.show profile 分析SQL
    -- 查看当前MySQL是否支持profile
    select @@have_profiling;
    select @@profiling;
    
    -- 默认profiling是关闭的
    set profiling=1;  -- 可以进行开启
    
    mysql> set profiling=1;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> select count(*) from payment;
    +----------+
    | count(*) |
    +----------+
    |    16049 |
    +----------+
    1 row in set (0.01 sec)
    
    mysql> show profiles;
    +----------+------------+------------------------------+
    | Query_ID | Duration   | Query                        |
    +----------+------------+------------------------------+
    |        1 | 0.00443500 | select count(*) from payment |
    +----------+------------+------------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    show profile for query_id;
    -- 能够看到执行过程中线程的每个状态和消耗时间
    mysql> show profile for query 1;
    +--------------------------------+----------+
    | Status                         | Duration |
    +--------------------------------+----------+
    | starting                       | 0.000112 |
    | Executing hook on transaction  | 0.000020 |
    | starting                       | 0.000010 |
    | checking permissions           | 0.000029 |
    | Opening tables                 | 0.000062 |
    | init                           | 0.000016 |
    | System lock                    | 0.000013 |
    | optimizing                     | 0.000021 |
    | statistics                     | 0.000020 |
    | preparing                      | 0.000017 |
    | executing                      | 0.004047 |
    | end                            | 0.000013 |
    | query end                      | 0.000004 |
    | waiting for handler commit     | 0.000009 |
    | closing tables                 | 0.000010 |
    | freeing items                  | 0.000020 |
    | cleaning up                    | 0.000012 |
    +--------------------------------+----------+
    17 rows in set, 1 warning (0.00 sec)
    
    • 5.利用trace分析优化器
    -- 打开trace,设置格式为JSON
    SET OPTIMIZER_TRACE="enabled=on",END_MARKERS_IN_JSON=on;
    -- 设置trace最大能够使用的内存大小
    SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;
    
    -- 检查文件可以知道Mysql是如何执行SQL
    
    SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACEG
    
    • 6.确定问题并采取相应的优化措施

    创建新的索引,减少需要扫描的行数

    索引的使用可以大大提高数据库的访问速度

    2.索引

    索引是在MySQL的存储引擎层中实现的,不是在服务器层实现

    不同的存储引擎有不同的索引类型和实现

    1.索引的分类

    • B-Tree索引,最常见的索引类型

    经典的B树结构,可以进行全关键字、关键字范围和关键字前缀查询innoDB的B+Tree索引分为主索引和辅助索引

    • HASH索引,只有Memory引擎支持,使用场景简单

    hash索引适合key-value查询,hash索引要比b-tree索引查询更迅速

    • R-Tree索引(空间索引),MyISAM的一个特殊索引类型,使用较少
    • Full-text(全文索引),MyISAM的一个特殊索引类型,主要用于全文索引

    BreakPoint

    date:2020.06.28

    Page:282---《深入浅出MySQL数据库开发优化》第18章SQL优化

  • 相关阅读:
    UIActivityIndicatorView的详细使用
    iOS开发多线程篇—GCD的常见用法
    UIScrollView的属性总结
    关于UIView的autoresizingMask属性的研究
    Robot FrameWork 教程链接
    数据恢复基础知识
    数据恢复基础知识
    selenium webdriver 学习笔记(三)
    selenium webdriver 学习笔记(二)
    selenium webdriver 学习笔记(一)
  • 原文地址:https://www.cnblogs.com/GeekDanny/p/13203194.html
Copyright © 2011-2022 走看看