本文共 20052 字,大约阅读时间需要 66 分钟。
本周的内容重中之重,数据库MySQL,
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。
应用环境
与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL [1] 自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本
系统特性编辑
1. [2] 使用 C和 C++编写,并使用了多种编译器进行测试,保证了源代码的可移植性。 2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。 3.为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。 4.支持多线程,充分利用 CPU 资源。 5.优化的 SQL查询算法,有效地提高查询速度。 6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。 7.提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作数据表名和数据列名。 8.提供 TCP/IP、ODBC 和 JDBC等多种数据库连接途径。 9.提供用于管理、检查、优化数据库操作的管理工具。 10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。 11.支持多种存储引擎。 12.MySQL 是开源的,所以你不需要支付额外的费用。 13.MySQL 使用标准的 SQL数据语言形式。 14.MySQL 对 PHP 有很好的支持,PHP是比较流行的 Web 开发语言。 15.MySQL是可以定制的,采用了 GPL协议,你可以修改源码来开发自己的 MySQL 系统。 16.在线 DDL/更改功能,数据架构支持动态应用程序和开发人员灵活性(5.6新增) 17.复制全局事务标识,可支持自我修复式集群(5.6新增) 18.复制无崩溃从机,可提高可用性(5.6新增) 19.复制多线程从机,可提高性能(5.6新增) 20.3倍更快的性能(5.7 [3] 新增) 21.新的优化器(5.7新增) 22.原生JSON支持(5.7新增) 23.多源复制(5.7新增) 24.GIS的空间扩展 [4] (5.7新增)1.RPM安装 RPM包安装 CentOS 7:安装光盘直接提供 mariadb-server 服务器包 mariadb 客户端工具包CentOS 6提高安全性 mysql_secure_installation 设置数据库管理员root口令 禁止root远程登录 删除anonymous用户帐号 删除test数据库客户端程序: mysql: 交互式的CLI工具 mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中 mysqladmin:基于mysql协议管理mysqld mysqlimport:数据导入工具MyISAM存储引擎的管理工具: myisamchk:检查MyISAM库 myisampack:打包MyISAM表,只读服务器端程序 mysqld_safe mysqld mysqld_multi 多实例 ,示例:mysqld_multi --examplemysql用户账号由两部分组成: 'USERNAME'@'HOST‘说明: HOST限制此用户可通过哪些远程主机连接mysql服务器 支持使用通配符: % 匹配任意长度的任意字符 172.16.0.0/255.255.0.0 或 172.16.%.% _ 匹配任意单个字符服务器监听的两种socket地址: ip socket: 监听在tcp的3306端口,支持远程通信 unix sock: 监听在sock文件上,仅支持本机通信 如:/var/lib/mysql/mysql.sock) 说明:host为localhost,127.0.0.1时自动使用unix sock侦听3306/tcp端口可以在绑定有一个或全部接口IP上vim /etc/my.cnf [mysqld] skip-networking=1关闭网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改
2.二进制安装
二进制格式安装过程(1) 准备用户 groupadd -r -g 306 mysql useradd -r -g 306 -u 306 –d /data/mysql mysql(2) 准备数据目录,建议使用逻辑卷 mkdir /data/mysql chown mysql:mysql /data/mysql(3) 准备二进制程序 tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local cd /usr/local ln -sv mariadb-VERSION mysql chown -R root:mysql /usr/local/mysql/(5)创建数据库文件 cd /usr/local/mysql/ ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql(6)准备服务脚本,并启动服务 cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld chkconfig --add mysqld service mysqld start(7)PATH路径 echo ‘PATH=/user/local/mysql/bin:$PATH’ > /etc/profile.d/mysql(8)安全初始化 /user/local/mysql/bin/mysql_secure_installation
3.编译安装
安装包yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel做准备用户和数据目录 useradd -r -s /sbin/nologin -d /data/mysql/ mysql mkdir /data/mysql chown mysql.mysql /data/mysql tar xvf mariadb-10.2.18.tar.gzcmake 编译安装cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译编译选项:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.htmlcd mariadb-10.2.18/cmake . \-DCMAKE_INSTALL_PREFIX=/app/mysql \-DMYSQL_DATADIR=/data/mysql/ \-DSYSCONFDIR=/etc/mysql \-DMYSQL_USER=mysql \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_ARCHIVE_STORAGE_ENGINE=1 \-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \-DWITH_PARTITION_STORAGE_ENGINE=1 \-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \-DWITH_DEBUG=0 \-DWITH_READLINE=1 \-DWITH_SSL=system \-DWITH_ZLIB=system \-DWITH_LIBWRAP=0 \-DENABLED_LOCAL_INFILE=1 \-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_cimake && make install提示:如果出错,执行rm -f CMakeCache.txt准备环境变量 echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh生成数据库文件 cd /app/mysql/ scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql准备配置文件 cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf准备启动脚本 cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld启动服务 chkconfig --add mysqld ;service mysqld start
关系型数据库的常见组件
数据库:database 表:table 行:row 列:column 索引:index 视图:view 用户:user 权限:privilege 存储过程:procedure 存储函数:function 触发器:trigger 事件调度器:event scheduler,任务计划数据库操作
创建数据库: 1.CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME'; 2.CHARACTER SET 'character set name’COLLATE 'collate name' 修改数据库: ALTER DATABASE DB_NAME character set utf8;删除数据库 DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME'; 查看支持所有字符集:SHOW CHARACTER SET; 查看支持所有排序规则:SHOW COLLATION; 获取命令使用帮助: mysql> HELP KEYWORD; 查看数据库列表: mysql> SHOW DATABASES;表
表:二维关系 设计表:遵循规范 定义:字段,索引 字段:字段名,字段数据类型,修饰符 约束,索引:应该创建在经常用作查询条件的字段上创建表:CREATE TABLE
(1) 直接创建 (2) 通过查询现存表创建;新表会被直接插入查询而来的数据 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] select_statement (3) 通过复制现存的表的表结构创建,但不复制数据 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) } 注意:Storage Engine是指表类型,也即在表创建时指明其使用的存储引擎,同一库中不同表可以使用不同的存储引擎 同一个库中表建议要使用同一种存储引擎类型字段信息
•col type1 •PRIMARY KEY(col1,...) •INDEX(col1, ...) •UNIQUE KEY(col1, ...) 表选项: •ENGINE [=] engine_name SHOW ENGINES;查看支持的engine类型 •ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} 获取帮助:mysql> HELP CREATE TABLE;查看所有的引擎:SHOW ENGINES
查看表:SHOW TABLES [FROM db_name] 查看表结构:DESC [db_name.]tb_name SHOW COLUMNS FROM [db_name.]tb_name 删除表:DROP TABLE [IF EXISTS] tb_name 查看表创建命令:SHOW CREATE TABLE tbl_name 查看表状态:SHOW TABLE STATUS LIKE 'tbl_name’ 查看库中所有表状态:SHOW TABLE STATUS FROM db_name数据长什么样
数据需要多少空间来存放系统内置数据类型和用户定义数据类型MySql支持多种列类型:1、整型
tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) 加了unsigned,则最大值翻倍,如:tinyint unsigned的取值范围为(0~255) int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,Int(1)和Int(20)是相同的 BOOL,BOOLEAN:布尔型,是TINYINT(1)的同义词。zero值被视为假,非zero值视为真2、浮点型(float和double),近似值
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位 double(m,d) 双精度浮点型16位精度(8字节) m总个数,d小数位 设一个字段定义为float(6,3),如果插入一个数 123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位 3、定点数 在数据库中存放的是精确值,存为十进制 decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位 MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如,decimal(18,9)小数点两边将各存储9个数字,一共使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占1个字节 浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储。double占用8个字节 因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal——例如存储财务数据。但在数据量比较大的时候,可以考虑使用bigint代替decimal4、字符串(char,varchar,_text)
char(n) 固定长度,最多255个字符 varchar(n) 可变长度,最多65535个字符 tinytext 可变长度,最多255个字符 text 可变长度,最多65535个字符 mediumtext 可变长度,最多2的24次方-1个字符 longtext 可变长度,最多2的32次方-1个字符 BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节 VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节 内建类型:ENUM枚举, SET集合5.二进制数据:BLOB
•BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写 •BLOB存储的数据只能整体读出 •TEXT可以指定字符集,BLOB不用指定字符集6.日期时间类型
•date 日期 '2008-12-2' •time 时间 '12:25:36' •datetime 日期时间 '2008-12-2 22:06:44' •timestamp 自动存储记录修改时间 •YEAR(2), YEAR(4):年份 timestamp字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类型的字段可以存放这条记录最后被修改的时间示例
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);DESC students;CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
表操作
DROP TABLE [IF EXISTS] 'tbl_name';ALTER TABLE 'tbl_name'字段: 添加字段:add ADD col1 data_type [FIRST|AFTER col_name] 删除字段:drop 修改字段: alter(默认值), change(字段名), modify(字段属性)索引: 添加索引:add index 删除索引:drop index表选项修改:查看表上的索引:SHOW INDEXES FROM [db_name.]tbl_name;查看帮助:Help ALTER TABLE
修改表示例
ALTER TABLE students RENAME s1;ALTER TABLE s1 ADD phone varchar(11) AFTER name;ALTER TABLE s1 MODIFY phone int;ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);ALTER TABLE s1 DROP COLUMN mobile;ALTER TABLE s1 character set utf8;ALTER TABLE s1 change name name varchar(20) character set utf8;Help ALTER TABLE 查看
多表查询
交叉连接:笛卡尔乘积
内连接: 等值连接:让表之间的字段以“等值”建立连接关系; 不等值连接 自然连接:去掉重复列的等值连接 自连接 外连接: 左外连接: FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col 右外连接 FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col 子查询:在查询语句嵌套着查询语句,性能较差基于某语句的查询结果再次进行的查询用在WHERE子句中的子查询用于比较表达式中的子查询;子查询仅能返回单个值SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);用于EXISTS用于FROM子句中的子查询
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause; 示例: SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30; 联合查询:UNION SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;1.函数:系统函数和自定义函数
系统函数: 自定义函数 (user-defined function UDF) 保存在mysql.proc表中 创建UDF CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...]) RETURNS {STRING|INTEGER|REAL} runtime_body 说明: 参数可以有多个,也可以没有参数 必须有且只有一个返回值 创建函数 示例:无参UDF CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!”; 查看函数列表: SHOW FUNCTION STATUS; 查看函数定义 SHOW CREATE FUNCTION function_name 删除UDF: DROP FUNCTION function_name 调用自定义函数语法: SELECT function_name(parameter_value, ...) 示例:有参数UDFDELIMITER //CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20)BEGINDELETE FROM students WHERE stuid = uid;RETURN (SELECT COUNT(stuid) FROM students);END//DELIMITER ;
2.存储过程
存储过程优势 存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程 提高了运行速度 同时降低网络数据传输量 存储过程与自定义函数的区别 存储过程实现的过程要复杂一些,而函数的针对性较强存储过程可以有多个返回值,而自定义函数只有一个返回值 存储过程一般可独立执行,而函数往往是作为其他SQL语句的一部分来使用 存储过程:存储过程保存在mysql.proc表中 创建存储过程 CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) routime_body proc_parameter : [IN|OUT|INOUT] parameter_name type 其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型 查看存储过程列表 SHOW PROCEDURE STATUS 查看存储过程定义 SHOW CREATE PROCEDURE sp_name 调用存储过程 CALL sp_name ([ proc_parameter [proc_parameter ...]]) CALL sp_name 说明:当无参时,可以省略"()",当有参数时,不可省略"()”存储过程修改 ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建 删除存储过程 DROP PROCEDURE [IF EXISTS] sp_name 创建无参存储过程delimiter //CREATE PROCEDURE showTime()BEGINSELECT now();END//delimiter ;CALL showTime
创建含参存储过程:只有一个IN参数
delimiter //CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)BEGINSELECT * FROM students WHERE stuid = uid;END//delimiter ;call selectById(2);
示例
delimiter //CREATE PROCEDURE dorepeat(n INT)BEGINSET @i = 0;SET @sum = 0;REPEAT SET @sum = @sum+@i; SET @i = @i + 1;UNTIL @i > n END REPEAT;END//delimiter ;CALL dorepeat(100);SELECT @sum;
创建含参存储过程:包含IN参数和OUT参数
delimiter //CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED)BEGINDELETE FROM students WHERE stuid >= uid;SELECT row_count() into num;END//delimiter ;call deleteById(2,@Line);SELECT @Line;
说明:创建存储过程deleteById,包含一个IN参数和一个OUT参数.调用时,传入删除的ID和保存被修改的行数值的用户变量@Line,select @Line;输出被影响行数
3.流程控制
存储过程和函数中可以使用流程控制来控制语句的执行流程控制: IF:用来进行条件判断。根据是否满足条件,执行不同语句 CASE:用来进行条件判断,可实现比IF语句更复杂的条件判断 LOOP:重复执行特定的语句,实现一个简单的循环 LEAVE:用于跳出循环控制 ITERATE:跳出本次循环,然后直接进入下一次循环 REPEAT:有条件控制的循环语句。当满足特定条件时,就会跳出循环语句 WHILE:有条件控制的循环语句 触发器 触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行 创建触发器CREATE[DEFINER = { user | CURRENT_USER }]TRIGGER trigger_nametrigger_time trigger_eventON tbl_name FOR EACH ROWtrigger_body
说明:
trigger_name:触发器的名称 trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发 trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件 tbl_name:该触发器作用在表名触发器示例
CREATE TABLE student_info (stu_id INT(11) NOT NULL AUTO_INCREMENT,stu_name VARCHAR(255) DEFAULT NULL,PRIMARY KEY (stu_id));CREATE TABLE student_count (student_count INT(11) DEFAULT 0);INSERT INTO student_count VALUES(0);
示例:创建触发器,在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少
CREATE TRIGGER trigger_student_count_insertAFTER INSERTON student_info FOR EACH ROWUPDATE student_count SET student_count=student_count+1;CREATE TRIGGER trigger_student_count_deleteAFTER DELETEON student_info FOR EACH ROWUPDATE student_count SET student_count=student_count-1;
查看触发器
SHOW TRIGGERS 查询系统表information_schema.triggers的方式指定查询条件,查看指定的触发器信息。 mysql> USE information_schema; Database changed mysql> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert'; 删除触发器 DROP TRIGGER trigger_name;创建用户:CREATE USER
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password']; 默认权限:USAGE 用户重命名:RENAME USER RENAME USER old_user_name TO new_user_name; 删除用户: DROP USER 'USERNAME'@'HOST‘ 示例:删除默认的空用户 DROP USER ''@'localhost'; 修改密码: mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password'); mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause; 此方法需要执行下面指令才能生效: mysql> FLUSH PRIVILEGES; mysqladmin -u root -poldpass password ‘newpass’ 忘记管理员密码的解决办法: 启动mysqld进程时,为其使用如下选项: --skip-grant-tables --skip-networking 使用UPDATE命令修改管理员密码 关闭mysqld进程,移除上述两个选项,重启mysqldMyISAM引擎特点
不支持事务 表级锁定 读写相互阻塞,写入不能读,读时不能写 只缓存索引 不支持外键约束 不支持聚簇索引 读取数据较快,占用资源较少 不支持MVCC(多版本并发控制机制)高并发 崩溃恢复性较差 MySQL5.5.5前默认的数据库引擎 MyISAM存储引擎适用场景 只读(或者写较少)、表较小(可以接受长时间进行修复操作) MyISAM引擎文件 tbl_name.frm 表格式定义 tbl_name.MYD 数据文件 tbl_name.MYI 索引文件InnoDB数据库文件
所有InnoDB表的数据和索引放置于同一个表空间中表空间文件:datadir定义的目录下数据文件:ibddata1, ibddata2, ...每个表单独使用一个表空间存储表的数据和索引启用:innodb_file_per_table=ON参看:https://mariadb.com/kb/en/library/xtradbinnodb-server-system-variables/#innodb_file_per_tableON (>= MariaDB 5.5)两类文件放在数据库独立目录中数据文件(存储数据和索引):tb_name.ibd表格式定义:tb_name.frm
其它存储引擎
1.Performance_Schema:Performance_Schema数据库使用 2.Memory :将所有数据存储在RAM中,以便在需要快速查找参考和其他类似数据的环境中进行快速访问。适用存放临时数据。引擎以前被称为HEAP引擎 3.MRG_MyISAM:使MySQL DBA或开发人员能够对一系列相同的MyISAM表进行逻辑分组,并将它们作为一个对象引用。适用于VLDB(Very Large Data Base)环境,如数据仓库 4.Archive :为存储和检索大量很少参考的存档或安全审核信息,只支持SELECT和INSERT操作;支持行级锁和专用缓存区 5.Federated联合:用于访问其它远程MySQL服务器一个代理,它通过创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,而后完成数据存取,提供链接单独MySQL服务器的能力,以便从多个物理服务器创建一个逻辑数据库。非常适合分布式或数据集市环境MySQL中的系统数据库
mysql数据库 是mysql的核心数据库,类似于Sql Server中的master库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息 performance_schema数据库 MySQL 5.5开始新增的数据库,主要用于收集数据库服务器性能参数,库里表的存储引擎均为PERFORMANCE_SCHEMA,用户不能创建存储引擎为PERFORMANCE_SCHEMA的表 information_schema数据库 MySQL 5.0之后产生的,一个虚拟数据库,物理上并不存在information_schema数据库类似与“数据字典”,提供了访问数据库元数据的方式,即数据的数据。比如数据库名或表名,列类型,访问权限(更加细化的访问方式)mysqld选项,服务器系统变量和服务器状态变量
注意:其中有些参数支持运行时修改,会立即生效;有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效;有些参数作用域是全局的,且不可改变;有些可以为每个用户提供单独(会话)的设置服务器配置
获取mysqld的可用选项列表: mysqld --help --verbose mysqld --print-defaults 获取默认设置 设置服务器选项方法: 在命令行中设置 shell> ./mysqld_safe --skip-name-resolve=1 在配置文件my.cnf中设置 skip_name_resolve=1查询缓存
查询缓存( Query Cache )原理 缓存SELECT操作或预处理查询的结果集和SQL语句,当有新的SELECT语句或预处理查询语句请求,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写 优缺点 不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从Query Cache中获得查询结果,提高查询性能查询缓存的判断规则,不够智能,也即提高了查询缓存的使用门槛,降低其效率; 查询缓存的使用,会增加检查和清理Query Cache中记录集的开销哪些查询可能不会被缓存
查询语句中加了SQL_NO_CACHE参数 查询语句中含有获得值的函数,包含自定义函数,如:NOW()CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ()等 对系统数据库的查询:mysql、information_schema 查询语句中使用SESSION级别变量或存储过程中的局部变量 查询语句中使用了LOCK IN SHARE MODE、FOR UPDATE的语句,查询语句中类似SELECT …INTO 导出数据的语句 对临时表的查询操作;存在警告信息的查询语句;不涉及任何表或视图的查询语句;某用户只有列级别权限的查询语句 事务隔离级别为Serializable时,所有查询语句都不能缓存查询缓存相关的服务器变量
query_cache_min_res_unit:查询缓存中内存块的最小分配单位,默认4k,较小值会减少浪费,但会导致更频繁的内存分配操作,较大值会带来浪费,会导致碎片过多,内存不足 query_cache_limit:单个查询结果能缓存的最大值,默认为1M,对于查询结果过大而无法缓存的语句,建议使用SQL_NO_CACHE query_cache_size:查询缓存总共可用的内存空间;单位字节,必须是1024的整数倍,最小值40KB,低于此值有警报 query_cache_wlock_invalidate:如果某表被其它的会话锁定,是否仍然可以从查询缓存中返回结果,默认值为OFF,表示可以在表被其它会话锁定的场景中继续从缓存返回数据;ON则表示不允许 query_cache_type:是否开启缓存功能,取值为ON, OFF, DEMANDSELECT语句的缓存控制
SQL_CACHE:显式指定存储查询结果于缓存之中 SQL_NO_CACHE:显式查询结果不予缓存 query_cache_type参数变量 query_cache_type的值为OFF或0时,查询缓存功能关闭 query_cache_type的值为ON或1时,查询缓存功能打开 SELECT的结果符合缓存条件即会缓存,否则,不予缓存,显式指定SQL_NO_CACHE,不予缓存,此为默认值 query_cache_type的值为DEMAND或2时,查询缓存功能按需进行,显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存 参看:命中率和内存使用率估算
查询缓存中内存块的最小分配单位 query_cache_min_res_unit :(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache查询缓存命中率 :Qcache_hits / ( Qcache_hits + Qcache_inserts ) 100% 查询缓存内存使用率:(query_cache_size – qcache_free_memory) / query_cache_size 100%InnoDB存储引擎
InnoDB存储引擎的缓冲池: 通常InnoDB存储引擎缓冲池的命中不应该小于99% 查看相关状态变量: show global status like 'innodb%read%'\G Innodb_buffer_pool_reads: 表示从物理磁盘读取页的次数 Innodb_buffer_pool_read_ahead: 预读的次数 Innodb_buffer_pool_read_ahead_evicted: 预读页,但是没有读取就从缓冲池中被替换的页数量,一般用来判断预读的效率 Innodb_buffer_pool_read_requests: 从缓冲池中读取页次数 Innodb_data_read: 总共读入的字节数 Innodb_data_reads: 发起读取请求的次数,每次读取可能需要读取索引
索引:是特殊数据结构,定义在查找时作为查找条件的字段,在MySQL又称为键key,索引通过存储引擎实现 优点: 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器避免排序和使用临时表 索引可以帮助将随机I/O转为顺序I/O 缺点: 占用额外空间,影响插入速度索引类型:
B+ TREE、HASH、R TREE 聚簇(集)索引、非聚簇索引:数据和索引是否存储在一起 主键索引、二级(辅助)索引 稠密索引、稀疏索引:是否索引了每一个数据项 简单索引、组合索引 左前缀索引:取前面的字符做索引 覆盖索引:从索引中即可取出要查询的数据,性能高B+TREE索引
B+Tree索引:顺序存储,每一个叶子节点到根结点的距离是相同的;左前缀索引,适合查询范围类的数据 可以使用B+Tree索引的查询类型: 全值匹配:精确所有索引列,如:姓wang,名xiaochun,年龄30 匹配最左前缀:即只使用索引的第一列,如:姓wang 匹配列前缀:只匹配一列值开头部分,如:姓以w开头的 匹配范围值:如:姓ma和姓wang之间 精确匹配某一列并范围匹配另一列:如:姓wang,名以x开头的只访问索引的查询B+Tree索引的限制:
如不从最左列开始,则无法使用索引,如:查找名xiaochun,或姓为g结尾 不能跳过索引中的列:如:查找姓wang,年龄30的,只能使用索引第一列 特别提示: 索引列的顺序和查询语句的写法应相匹配,才能更好的利用索引 为优化性能,可能需要针对相同的列但顺序不同创建不同的索引来满足不同类型的查询需求索引优化策略:
独立地使用列:尽量避免其参与运算,独立的列指索引列不能是表达式的一部分,也不能是函数的参数,在where条件中,始终将索引列单独放在比较符号的一侧 左前缀索引:构建指定索引字段的左侧的字符数,要通过索引选择性来评估 索引选择性:不重复的索引值和数据表的记录总数的比值多列索引:AND操作时更适合使用多列索引,而非为每个列创建单独的索引 选择合适的索引列顺序:无排序和分组时,将选择性最高放左侧索引优化建议
只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引 尽量使用短索引,如果可以,应该制定一个前缀长度 对于经常在where子句使用的列,最好设置索引 对于有多个列where或者order by子句,应该建立复合索引对于like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引 尽量不要在列上进行运算(函数操作和表达式操作) 尽量不要使用not in和<>操作SQL语句性能优化
查询时,能不要就不用,尽量写全字段名 大部分情况连接效率远大于子查询 多表连接时,尽量小表驱动大表,即小表 join 大表 在有大量记录的表分页时使用limit 对于经常使用的查询,可以开启缓存 多使用explain和profile分析查询语句 查看慢查询日志,找出执行时间长的sql语句优化管理索引
创建索引:CREATE INDEX [UNIQUE] index_name ON tbl_name (index_col_name[(length)],...);ALTER TABLE tbl_name ADD INDEX index_name(index_col_name);help CREATE INDEX;
删除索引:
DROP INDEX index_name ON tbl_name;ALTER TABLE tbl_name DROP INDEX index_name(index_col_name);
查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
优化表空间:
OPTIMIZE TABLE tb_name;
查看索引的使用
SET GLOBAL userstat=1;SHOW INDEX_STATISTICS;并发控制
锁策略:在锁粒度及数据安全性寻求的平衡机制显式使用锁 LOCK TABLES 加锁 tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ , WRITE UNLOCK TABLES 解锁FLUSH TABLES [tb_name[,...]] [WITH READ LOCK] 关闭正在打开的表(清除查询缓存),通常在备份前加全局读锁SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁
事务
事务Transactions:一组原子性的SQL语句,或一个独立工作单元事务日志:记录事务信息,实现undo,redo等故障恢复功能ACID特性: A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚 C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态 I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发 D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
启动事务:
BEGIN BEGIN WORK START TRANSACTION 结束事务: COMMIT:提交 ROLLBACK: 回滚 注意:只有事务型存储引擎中的DML语句方能支持此类操作 自动提交:set autocommit={1|0} 默认为1,为0时设为非自动提交 建议:显式请求和提交事务,而不要使用“自动提交”功能 事务支持保存点:savepoint SAVEPOINT identifier ROLLBACK [WORK] TO [SAVEPOINT] identifier RELEASE SAVEPOINT identifier事务隔离级别
事务隔离级别:从上至下更加严格 READ UNCOMMITTED 可读取到未提交数据,产生脏读 READ COMMITTED 可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致 REPEATABLE READ 可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据。此为MySQL默认设置 SERIALIZABILE 可串行化,未提交的读事务阻塞修改事务,或者未提交的修改事务阻塞读事务。导致并发性能差 MVCC: 多版本并发控制,和事务级别相关并发控制
死锁: 两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态 事务日志: 事务日志的写入类型为“追加”,因此其操作为“顺序IO”;通常也被称为:预写式日志 write ahead logging 事务日志文件: ib_logfile0, ib_logfile1转载于:https://blog.51cto.com/14231603/2389497