zoukankan      html  css  js  c++  java
  • MySQL---1、介绍

    一、MySQL简介

    1、MySQL简介

    MySQL是一个轻量级关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。目前MySQL被广泛地应用在Internet上的中小型网站中,由于体积小、速度快、总体拥有成本低,开放源码、免费,一般中小型网站的开发都选择Linux + MySQL作为网站数据库。
    MySQL是一个关系型数据库管理系统,MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,就增加了速度并提高了灵活性。
    MySQL的官方网站的网址是:www.mysql.com

    2、MySQL特性

    MySQL是一种使用广泛的数据库,特性如下:
    A、使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性   
    B、支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。   
    C、为多种编程语言提供了API。编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。   
    D、支持多线程,充分利用CPU资源   
    E、优化的SQL查询算法,有效地提高查询速度   
    F、既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名   
    G、提供TCP/IP、ODBC和JDBC等多种数据库连接途径   
    H、提供用于管理、检查、优化数据库操作的管理工具   
    I、可以处理拥有上千万条记录的大型数据库

    3、MySQL应用

    与大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。 目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器。由于Linux+Apache+MySQL+PHP都是自由或开放源码软件(FLOSS),因此使用LAMP不用花一分钱就可以建立起一个稳定、免费的网站系统。

    4、MySQL管理

    可以使用命令行工具管理MySQL数据库(命令mysql 和 mysqladmin),也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。   
    phpMyAdmin是由php写成的MySQL资料库系统管理程式,让管理者可用Web界面管理MySQL资料库。   
    phpMyBackupPro也是由PHP写成的,可以透过Web介面创建和管理数据库。它可以创建伪cronjobs,可以用来自动在某个时间或周期备份MySQL 数据库。   
    另外,还有其他的GUI管理工具,例如早先的mysql-front以及ems mysql manager,navicat 等等。

    5、相关概念

    MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

    • 表头(header): 每一列的名称;
    • 列(row): 具有相同数据类型的数据的集合;
    • 行(col): 每一行用来描述某个人/物的具体信息;
    • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
    • 键(key): 表中用来识别某个特定的人物的方法, 键的值在当前列中具有唯一性。

    二、MySLQ存储引擎

    1、MySQL存储引擎简介

    插件式存储引擎是MySQL数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据库,是否使用事务等。mySQL默认支持多种存储引擎,以适应不同领域的数据库应用需要。用户可以通过选择使用不同的存储引擎提高应用的效率,提供灵活的存储,用户设置可以按照自己的需要定制和使用自己的存储引擎,以实现最大程度的可定制性。
    MySQL常用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
    MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。
    InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。MySQL支持外键存储引擎只有InnoDB,在创建外键的时候,要求附表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

    2、MySQL存储引擎特性

    主要体现在性能、事务、并发控制、参照完整性、缓存、故障恢复,备份及回存等几个方面
    目前比较普及的存储引擎是MyISAM和InnoDB,而MyISAM又是绝大部分Web应用的首选。MyISAM与InnoDB的主要的不同点在于性能和事务控制上。
    MyISAM是早期ISAM(Indexed Sequential Access Method)的扩展实现,ISAM被设计为适合处理读频率远大于写频率的情况,因此ISAM以及后来的MyISAM都没有考虑对事物的支持,不需要事务记录,ISAM的查询效率相当可观,而且内存占用很少。MyISAM在继承了ISAM优点的同时,与时俱进的提供了大量实用的新特性和相关工具。例如考虑到并发控制,提供了表级锁。而且由于MyISAM是每张表使用各自独立的存储文件(MYD数据文件和MYI索引文件),使得备份及恢复十分方便(拷贝覆盖即可),而且还支持在线恢复。
    所以如果应用不需要事务,不支持外键,处理的只是基本的CRUD(增删改查)操作,那么MyISAM是不二选择。

    三、MySLQ数据类型

    1、常见

    MySQL有三大类数据类型, 分别为数字、日期时间、字符串, 这三大类中又更细致的划分了许多子类型:

    • 数字类型
      • 整数: tinyint、smallint、mediumint、int、bigint
      • 浮点数: float、double、real、decimal
    • 日期和时间: date、time、datetime、timestamp、year
    • 字符串类型
      • 字符串: char、varchar
      • 文本: tinytext、text、mediumtext、longtext
      • 二进制(可用来存储图片、音乐等):bit, tinyblob、blob、mediumblob、longblob

    2、详细

    1)整数类型

    类型字节数范围
    TNIYINT 1 -128~127
    SMALLINT 2 -32767~32768
    MEDIUMINT 3 -8388608~8388607
    INT 4 -2147483648~2147483647
    BIGINT 8 -9223372036854775808~9223372036854775807
    • 每个整数类型都有对应的无符号(UNSIGNED)类型。
    • 建议使用TINYINT代替ENUM。
    • 避免使用整数的显示宽度。

    2)实数类型

    类型字节备注
    FLOAT 4 单精度浮点数
    DOUBLE 8 双精度浮点数
    DECIMAL 可变 高精度定点数
    • DECIMAL只是一种存储格式,MySQL以二进制的合适存储DECIMAL类型的列。在计算中,DECIMAL会转换成DOUBLE。
    • 不建议指定浮点数的精度。
    • 不建议使用DECIMAL。
    • 建议要存储的实数乘以相应的倍数,使用整数类型运算和存储。

    3)字符串类型

    VARCHAR vs CHAR

    类型最大长度备注
    CHAR(size) 255字节 定长。size指定的是字符数,不是字节数。
    VARCHAR(size) 65532字节 变长。size指定的是字符数,不是字节数。
    • 适用VARCHAR:

      • 字符串地最大长度比平均长度大很多;
      • 列更新很少,所以碎片不是问题;
      • 使用像UTF8这样复杂地字符集,每个字符都可能使用不同的字节数进行存储。
    • 适用CHAR:

      • 短字符串;
      • 所有值都接近一个长度;
      • 经常变更的列,这样不易产生碎片;
    • CHAR类型的列,原字符串末尾的空格会被“干掉”,再填充空格。MySQL检索CHAR不会使用末尾的空格。(列是定长的,MySQL没有存储写入的字符串有多长,只好一刀切,末尾的空格都忽略掉。)

    • VARCHAR末尾的空格不会被“干掉”,检索的时候会用到。(MySQL存储了写入的字符串的长度,这样可以知道字符串末尾有多少各空格是你写入的。)

    • VARCHAR(5)和VARCHAR(200),如果都只存了"abc",它们有什么不同呢?实际上,MySQL会分配固定大小地内存块来保存内部值,因此VARCHAR(200)的列尽管只存了和VARCHAR(5)一样的字符串,但是分配的内存可能会大得多。

    BINARY vs VARBINARY

    类型最大长度备注
    BINARY 255 定长
    VARBINARY 65535 变长
    • BINARY和VARBINARY与CHAR和VARCHAR非常类似。
    • BINARY和VARBINARY存储的是二进制字符串,与字符集无关。
    • BINARY的末尾会被填充,并且会加入检索。

    BLOB vs TEXT

    L表示数据的长度。
    L+x表示存储需要的空间。

    类型存储
    TINYBLOB L+1 bytes, L < 2^8
    SMALLBLOB/BLOB L+2 bytes, L < 2^16
    MEDIUMBLOB L+3 bytes, L < 2^24
    LONGBLOB L+4 bytes, L < 2^32
    TINYTEXT L+1 bytes, L < 2^8
    SMALLTEXT/TEXT L+2 bytes, L < 2^16
    MEDIUMTEXT L+3 bytes, L < 2^24
    LONGTEXT L+4 bytes, L < 2^32
    • BLOB系列存储二进制字符串,与字符集无关。
    • TEXT系列存储非二进制字符串,与字符集相关。
    • 一般情况下,你可以认为BLOB是一个更大的VARBINARY;TEXT是一个更大的VARCHAR。
    • MySQL只能对BLOB和TEXT的前面max_sort_length各字符进行排序和索引。
    • BLOB和TEXT都不能有default value。
    • 当BLOB和TEXT的长度太大时,InnoDB会使用专门的“外部”存储区域来进行存储。

    4)日期和时间类型

    5)一些原则

    • 选择最小的满足需求的数据类型。

    一般情况下,应该尽量使用可以正确存储数据的最小数据类型。
    简单就好。

    比如,用MySQL的内建类型date, time, datetime来存储时间,而不是使用字符串;用INT UNSIGNED来存储IPv4地址。

    如何存储IPv6的地址?IPv6地址128bit,MySQL最大的整数类型BIGINT只有64bit。可以将其存储成定长(16字节)的二进制字符

    • 尽量避免使用NULL。

    四.MySQL体系结构简介

    4.1.MySQL逻辑概念

    图片来自网络
    • 连接层
      通讯协议的处理、线程处理、网络权限、账号认证等

    • 处理层
      权限处理、结果缓存(Query cache)、查询解析、优化器、查询执行、返回等

    • 存储层
      用于持久化处理层的数据,innodb、MyISAM、Memory、Heap

    4.2.MySQL存储结构

    • 实例
      由数据库后台进程/线程以及一个共享区域组成(程序的概念),数据库实例是用来操作数据库文件的

    • 数据库
      数据库(数据库文件)是一个或者一组二进制文件,通常来说存在与文件系统之上

    • 单进程多线程结构
      不会影响MySQL的性能,看程序如何写。(多进程程序,进程间通信开销大于多线程)

    • 存储引擎的概念
      可以理解成文件系统,例如FAT32, NTFS, EXT4。 一个表是一个分区,引擎就是分区的文件系统
      存储引擎的对象就是表

    • 逻辑存储结构
      instance
      database
      schema
      tablespace
      table

    4.3.MySQL文件结构

    图片来自原创
    • MySQL配置文件
      my.cnf

    • 表结构的组成
      表结构定义文件:frm
      innodb数据文件:ibd
      MyISAM数据文件:myi
      共享表空间文件:ibdata*

    • error log(错误日志)
      error_log

    • binary log(二进制日志)
      记录数据库写入操作的日志,可以用于备份恢复后者是master/slave 的复制
      log_bin
      log_bin_index
      log_bin_basename

    • slow query log(慢日志)
      将运行超过某一个时间戳的阈值的SQL语句记录到文件
      slow_query_log
      slow_launch_time
      slow_query_log_file

    • general log(常规日志也叫全量日志)
      开启后将记录所有链接到MySQL任何的操作
      general_log
      general_log_file

    • relay-log(中继日志)
      io_thread 从master读到的日志写到中继日志中,供sql_thread执行完,已完成复制成功
      relay_log=relay-bin

    • innodb redo log
      5.6之前redo log 个数总大小不能超过4G
      5.6.之前redo log的大小不能更改,变更后数据器启动失败
      innodb_log_group_home_dir=/data01/mysql/mysql3306/logs
      innodb_log_file_size=200M
      innodb_log_files_in_group=3

  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/xiaohua19920/p/9617348.html
Copyright © 2011-2022 走看看