MySQL是一个轻量级关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。目前MySQL被普遍地应用在Internet上的中小型网站中,因为体积小、速度快、整体拥有成本低,开放源码、免费,通常中小型网站的开发都选择Linux + MySQL做为网站数据库。
MySQL是一个关系型数据库管理系统,MySQL是一种关联数据库管理系统,关联数据库将数据保存在不一样的表中,而不是将全部数据放在一个大仓库内,就增长了速度并提升了灵活性。
MySQL的官方网站的网址是:www.mysql.comphp
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 23十二、BIG5,日文的Shift_JIS等均可以用做数据表名和数据列名
G、提供TCP/IP、ODBC和JDBC等多种数据库链接途径
H、提供用于管理、检查、优化数据库操做的管理工具
I、能够处理拥有上千万条记录的大型数据库mysql
与大型数据库例如Oracle、DB二、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,可是这丝毫也没有减小它受欢迎的程度。对于通常的我的使用者和中小型企业来讲,MySQL提供的功能已经绰绰有余,并且因为MySQL是开放源码软件,所以能够大大下降整体拥有成本。 目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即便用Linux做为操做系统,Apache做为Web服务器,MySQL做为数据库,PHP做为服务器端脚本解释器。因为Linux+Apache+MySQL+PHP都是自由或开放源码软件(FLOSS),所以使用LAMP不用花一分钱就能够创建起一个稳定、免费的网站系统。算法
可使用命令行工具管理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 等等。sql
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"能够理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:数据库
插件式存储引擎是MySQL数据库最重要的特性之一,用户能够根据应用的须要选择如何存储和索引数据库,是否使用事务等。mySQL默认支持多种存储引擎,以适应不一样领域的数据库应用须要。用户能够经过选择使用不一样的存储引擎提升应用的效率,提供灵活的存储,用户设置能够按照本身的须要定制和使用本身的存储引擎,以实现最大程度的可定制性。
MySQL经常使用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其余存储引擎都是非事务安全表。
MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。
InnoDB存储引擎提供了具备提交、回滚和崩溃恢复能力的事务安全。可是比起MyISAM存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。MySQL支持外键存储引擎只有InnoDB,在建立外键的时候,要求附表必须有对应的索引,子表在建立外键的时候也会自动建立对应的索引。编程
主要体如今性能、事务、并发控制、参照完整性、缓存、故障恢复,备份及回存等几个方面
目前比较普及的存储引擎是MyISAM和InnoDB,而MyISAM又是绝大部分Web应用的首选。MyISAM与InnoDB的主要的不一样点在于性能和事务控制上。
MyISAM是早期ISAM(Indexed Sequential Access Method)的扩展实现,ISAM被设计为适合处理读频率远大于写频率的状况,所以ISAM以及后来的MyISAM都没有考虑对事物的支持,不须要事务记录,ISAM的查询效率至关可观,并且内存占用不多。MyISAM在继承了ISAM优势的同时,与时俱进的提供了大量实用的新特性和相关工具。例如考虑到并发控制,提供了表级锁。并且因为MyISAM是每张表使用各自独立的存储文件(MYD数据文件和MYI索引文件),使得备份及恢复十分方便(拷贝覆盖便可),并且还支持在线恢复。
因此若是应用不须要事务,不支持外键,处理的只是基本的CRUD(增删改查)操做,那么MyISAM是不二选择。缓存
MySQL有三大类数据类型, 分别为数字、日期\时间、字符串, 这三大类中又更细致的划分了许多子类型:安全
1)整数类型服务器
类型 | 字节数 | 范围 |
---|---|---|
TNIYINT | 1 | -128~127 |
SMALLINT | 2 | -32767~32768 |
MEDIUMINT | 3 | -8388608~8388607 |
INT | 4 | -2147483648~2147483647 |
BIGINT | 8 | -9223372036854775808~9223372036854775807 |
2)实数类型网络
类型 | 字节 | 备注 |
---|---|---|
FLOAT | 4 | 单精度浮点数 |
DOUBLE | 8 | 双精度浮点数 |
DECIMAL | 可变 | 高精度定点数 |
3)字符串类型
VARCHAR vs CHAR
类型 | 最大长度 | 备注 |
---|---|---|
CHAR(size) | 255字节 | 定长。size指定的是字符数,不是字节数。 |
VARCHAR(size) | 65532字节 | 变长。size指定的是字符数,不是字节数。 |
适用VARCHAR:
适用CHAR:
CHAR类型的列,原字符串末尾的空格会被“干掉”,再填充空格。MySQL检索CHAR不会使用末尾的空格。(列是定长的,MySQL没有存储写入的字符串有多长,只好一刀切,末尾的空格都忽略掉。)
VARCHAR末尾的空格不会被“干掉”,检索的时候会用到。(MySQL存储了写入的字符串的长度,这样能够知道字符串末尾有多少各空格是你写入的。)
VARCHAR(5)和VARCHAR(200),若是都只存了"abc",它们有什么不一样呢?实际上,MySQL会分配固定大小地内存块来保存内部值,所以VARCHAR(200)的列尽管只存了和VARCHAR(5)同样的字符串,可是分配的内存可能会大得多。
BINARY vs VARBINARY
类型 | 最大长度 | 备注 |
---|---|---|
BINARY | 255 | 定长 |
VARBINARY | 65535 | 变长 |
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 |
4)日期和时间类型
5)一些原则
通常状况下,应该尽可能使用能够正确存储数据的最小数据类型。
简单就好。
好比,用MySQL的内建类型date, time, datetime来存储时间,而不是使用字符串;用INT UNSIGNED来存储IPv4地址。
如何存储IPv6的地址?IPv6地址128bit,MySQL最大的整数类型BIGINT只有64bit。能够将其存储成定长(16字节)的二进制字符?
链接层
通信协议的处理、线程处理、网络权限、帐号认证等
处理层
权限处理、结果缓存(Query cache)、查询解析、优化器、查询执行、返回等
存储层
用于持久化处理层的数据,innodb、MyISAM、Memory、Heap
实例
由数据库后台进程/线程以及一个共享区域组成(程序的概念),数据库实例是用来操做数据库文件的
数据库
数据库(数据库文件)是一个或者一组二进制文件,一般来讲存在与文件系统之上
单进程多线程结构
不会影响MySQL的性能,看程序如何写。(多进程程序,进程间通讯开销大于多线程)
存储引擎的概念
能够理解成文件系统,例如FAT32, NTFS, EXT4。 一个表是一个分区,引擎就是分区的文件系统
存储引擎的对象就是表
逻辑存储结构
instance
database
schema
tablespace
table
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