mysql
学习总结
备注:<>里的内容可改
1MYSQL优缺点
优点
|
缺点
|
1. 源码公开,免费
2. 跨平台
3. 为多种开发语言和包提供了
API
4. 支持多线程
5. 小巧、灵活、速度较快
6. 支持各种字符集
7. 提供各种连接、优化的工具包
|
1. 不完善,很多数据库特性不支持
2. 只适合中小型应用,对于大型应用,可以跟其他数据库互补;
3. 数据库系统数据量只能达到千万级别;
|
问题:
1、比较热门的Web站点会因为被访问次数急剧增长而不能及时处理用户的请求,导致用户进行长时间的等待
2、服务的高可用性也越来越重要 ,任何例外的服务中断都将造成不可估量的损失。
3、如何在集群系统中实行并行网络服务
4、信息发布系统
CMS: 信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的
CMS是必不可少的
5、对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用
html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储在数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。
6、图片
---图片服务器
7、热数据
2数据库服务启动和关闭(DOS)
1、 关闭
net stop <mysql>
2、 启动
net start <mysql>
3bin文件下各执行文件分析
1、 mysqldump: mysql用于转存储数据库的程序
è当需要在不同的架构之间转移数据库,可以使用mysqldump创建含有sql语句的文件。
è备份数据库
è共享数据
2、 Mysqladmin:用于执行管理性操作,如创建数据库,修改用户密码,删除数据库等等。
create databasename 创建一个新数据库
drop databasename 删除一个数据库及其所有表
extended-status 给出服务器的一个扩展状态消息
flush-hosts 洗掉所有缓存的主机
flush-logs 洗掉所有日志
flush-tables 洗掉所有表
flush-privileges 再次装载授权表(同reload)
kill id,id,... 杀死mysql线程
password 新口令,将老口令改为新口令
ping 检查mysqld是否活着
processlist 显示服务其中活跃线程列表
reload 重载授权表
refresh 洗掉所有表并关闭和打开日志文件
shutdown 关掉服务器
status 给出服务器的简短状态消息
variables 打印出可用变量
version 得到服务器的版本信息
3、 mysqld:mysql数据库服务器相关程序
4、 mysqlshow:显示数据库、数据库中的表或有关表中列或索引的信息,担当SHOW SQL语句的命令行接口的作用。
5、 mysqlimport:必须具备有一定的格式,而且最重要的是文件的名字必须同表的名字一模一样。而用source new.sql的方式没有这个限制。
mysqlimport –u <root> -p<******> --fields-terminated-by=, --lines-terminated-by=\n <database_name> <c:\\temp.sql>
6、 perror:查找错误信息
格式为:
èperror <错误代码>
4关系数据库和非关系数据库
1
、关系数据库:通俗的讲就是数据库里表间具有一定的关系,可分为:一对一、一对多和多对多
->
一对一:A表中的每一记录仅能在B表中有一个匹配的记录,并且B表中的每一记录仅能在A表中有一个匹配记录。但大多以此方式相关的信息都在一个表中。
->
一对多:A表中的一个记录能与B表中的许多记录匹配,而B表中的一个记录在A表中却只能有一个记录匹配。如:一个小学学校有好多个学生,但每个学生却只能就读于一个小学学校。
->
多对多:实际上就是两个一对多构成的。A表中的记录在B表中有许多记录匹配,且B表中的记录在A表中也有许多记录匹配。一般都要借助于联接表,其包含两个表的主键列如:多个学生选多门课,学生表(学号,姓名);课程表(课程号,课程名);联接表:选课表(学号,课程名)
2
、非关系型数据库
非关系型数据库就是表与表之间没有关系,孤立存在。如:key-value数据库
->
为什么要使用非关系数据库
1、对数据库高并发读写的需求;2、对海量数据的高效率存储和访问的需求;3、对数据库的高可扩展性和高可用性的需求
5多表互连查询
一对多关系:
有两个表:
一个表为:
mysql> select * from mytabel;
+------+-----+
| name | sex |
+------+-----+
| abb | f
|
| mary | f
|
| tom | m
|
+------+-----+
另一个表为:
mysql> select * from title;
+--------+-------+
| writer | title |
+--------+-------+
| abb
| a1 |
| mary
| b1 |
| abb
| a2 |
| tom
| c1 |
| tom
| c2 |
+--------+-------+
要查询作者abb的姓名、性别、文章,则如下:
mysql> select t.writer,t.title,m.sex from mytabel m,title t where m.name=t.write
r and t.writer='abb';
结果:
+--------+-------+-----+
| writer | title | sex |
+--------+-------+-----+
| abb
| a1 | f |
| abb
| a2 | f |
+--------+-------+-----+
2 rows in set (0.00 sec)
多对多关系:
->CREATE TABLE IF NOT EXISTS contact(contact_id int(11) NOT NULL AUTO_INCREMENT, user_name varchar(255),PRIMARY KEY(contact_id));
->CREATE TABLE IF NOT EXISTS droit(droit_id int( 11 ) NOT NULL AUTO_INCREMENT , droit varchar(255),PRIMARY KEY(droit_id));
->CREATE TABLE IF NOT EXISTS contactdroit(contactdroit_id int(11) NOT NULL AUTO_INCREMENT,contact_id int( 11 ),droit_id int( 11 ),PRIMARY KEY( contactdroit_id ));
->Insert into contact(contact_id, user_name) values(1,'user1');
->Insert into contact(contact_id, user_name) values(2,'user2');
->Insert into contact(contact_id, user_name) values(3,'user3');
->Insert into droit(droit_id, droit) values(1,'admin');
->Insert into droit(droit_id, droit) values(2,'superuser');
->Insert into contactdroit(contact_id, droit_id) values(1, 1);
->Insert into contactdroit(contact_id, droit_id) values(2, 1);
->Insert into contactdroit(contact_id, droit_id) values(3, 2);
->SELECT c.contact_id, d.droit_id, d.droit FROM contact c, contactdroit cd, droit d where c.contact_id = cd.contact_id and cd.droit_id = d.droit_id;
结果:
contact_id droit_id droit
1 1 admin
2 1 admin
3 2 superuser
6常用的SQL语句
6.1登入/登出
mysql –h <localhost> –u <root> –p<root>;(本地“-h localhost”可省略)
或者mysql –h <localhost> –u <root> –p,回车再输入密码
6.2修改用户密码
有以下几种方法:
1、 mysqladmin –u <root> –p<root> <12345>(其中,12345为新密码,-proot中的root为旧密码)
2、 登录进mysql,然后
UPDATE mysql.user SET password=PASSWORD(<‘new psw’>) WHERE user=<’root’>;
FLUSH PRIVILEGES; //不能丢
6.3创建新用户
GRANT ALL PRIVILEGES ON <fangl.*> to <fangl@localhost> IDENTIFIED BY <‘fangl’>;
6.4授权远程登录
GRANT ALL PRIVILEGES ON *.* TO <‘ root’@’192.168.13.103’> IDENTIFIED BY <‘root’> WITH GRANT OPTION;
6.5选择数据库
USE <database>//这边不用分号
6.6常用的查询语句
1
、查询当前用户
SELECT USER();
2
、查询当前数据库拥有的表
SHOW TABLES;
3
、查询表结构
DESCRIBE <table>;
4
、查询表数据
SELECT * FROM <table>;
SELECT * FROM <table> WHERE <name>=’xxxx’;
SELECT <id>,<name> FROM <table> WHERE <name>=’xxxx’;
5
、查询有哪些存储过程
SHOW PROCEDURE STATUS;
6
、查询有哪些数据库
SHOW DATABASES;
7
、查询某个存储过程的详细信息
SHOW CREATE PROCEDURE <pro1>;
8
、查询当前数据库版本和当前时间
SELECT VERSION(),CURRENT_DATE;
9
、排序
SELECT * FROM <table_name> ORDER BY <name> DESC/ASC; //DESC降序,ASC升序
10
、求和
SELECT COUNT(*) AS <count> FROM <table_name>;
11
、随机取出几条记录
SELECT * FROM <table_name> ORDER BY RAND() LIMIT 2;
6.7增删改
1
、
增加
增加行
INSERT INTO <table> VALUES (2,’YY’,’UU’),(1,’RR’,’TTTT’),(3,’EEE’,’RRRR’); //增加三行数据
增加列
ALTER TABLE <table_name> ADD <c_name> <varchar(20) >;
2
、删除
删除一行
DELETE FROM <table_name> WHERE <name=’kitty’>;
删除一列
ALTER TABLE <table_name> DROP COLUNM <c_name>;
删除全部数据
DELETE FROM <table_name>;或者
TRUNCATE <table_name>;(删除的行数目不被知道)
删除多表行
DELETE <t1>,< t2> FROM <t1>,< t2>,<t3> WHERE <t1.id=t2.id> AND <t2.id=t3.id>;或者
DELETE FROM <t1>,< t2> USING <t1>,< t2>,<t3> WHERE <t1.id=t2.id> AND <t2.id=t3.id>;
删除整个表
DROP <table_name>
3、
修改
修改行
UPDATE <table_name> SET <species=’dog’,owner=’kuku’> WHERE <name=’kitty’>;
6.8导入文本
LOAD DATA LOCAL INFILE <’c:\pet.txt’> INTO TABLE pet;
LINES TERMINATED BY ‘\r\n’;
6.9更改表名
ALTER TABLE <table_name> RENAME <new_table>;
6.10复制表结构及数据
CREATE TABLE <new_table> SELECT (<name,owner/*>) FROM <old_table>;
6.11拷贝表数据
INSERT INTO <目标表>(<name,owner>) SELECT <sex,species> FROM <源表>;
6.12只复制表结构
CREATE TABLE <new_table> LIKE <old_table>;或者
CREATE TABLE <new_table> SELECT * FROM <old_table> WHERE 1=2;
6.13数据库导入/导出
1
、导出
mysqldump –u root –p <database_name>><name.sql>;
2
、导入
->登入数据库;
->use <database_name> //没有,则新建
->source <c:/name.sql>;
7事务(ACID)
例子:比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个
事务!
MYSQL
中只有INNODB
和BDB
类型的数据表才能支持事务
其主要有两种方法:
1、 用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、 直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。当你用 set autocommit=0 的时候,你以后所有的SQL都将作为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务。
优点:
1、 更安全。即使mysql崩溃或遇到硬件问题,要么自动恢复,要么从备份加事务日志恢复来取回数据。如果更新失败,所有改变也都会变回原来,而非事务所有发生的改变都是永久的。
2、 可以合并许多语句,并用commit语句同时接受他们全部(如果autocommit被禁止掉)
缺点:
1、 相比起非事务,事务需要更多的磁盘空间和内存
2、 相比起非事务,事务执行的更慢,牺牲一部分速度来保证数据的正确性(一个事务处理后的结果,影响了其他事务,那么其他事务会撤回,mysql不支持嵌套事务 ,100%的隔离必然损失速度)
3、并发操作带来的缺陷:由于并发操作带来的数据不一致性包括:
丢失数据修改、
读”脏”数据(脏读)、
不可重复读、
产生幽灵数据。
产生这些数据的不一致性的主要原因是并发操作
破坏了事务的隔离性。
8存储过程
优点:
1、存储过程使系统运行的更快(针对解析过程和网络传输)。提升速度的主要方法却在于能否降低网络信息流量。如果我们需要处理的是需要检查、循环、多语句但没有用户交互的重复性任务,我们就可以使用保存在服务器上的存储过程来完成。这样在执行任务的每一步时服务器和客户端之间就没那么多的信息来往了。
3、存储过程可重用,具有较好的扩展性。存储过程可以移植到Mysql支持的任何平台的系统平台上,不需要我们额外添加运行环境包,也不需要为程序在操作系统中设置执行许可,或者为我们的不同型号的电脑配置不同的包。
缺点:
1、比英语语言慢,且原始,可用的函数有限,很难写出复杂的字符串操作和逻辑,增加
了部署应用程序的复杂性,而且没有很好的调试工具。
2、安全性,因为存储例程与数据库保存在一起,所以很可能成为安全隐患,比如存储例程使用了非标准的加密函数,那么数据库遭受攻击的时候无法保护数据。如果加密函数在代码里,攻击者将会危及数据库和代码。
3、mysql对存储代码的执行有很多的限制,比如执行计划的缓存是针对单个连接,游标是用临时表实现的。
9架构类
9.1mysql的逻辑结构
最上面不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理、认证、安全管理等。中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能,包括存储过程、触发器和视图等。最下面是存储引擎,它负责存取数据。服务器通过storage engine API可以和各种存储引擎进行交互。
服务器分布式:
其中,当http那有数据包过来时,通过manage来得到应该将数据存储到哪台memcached里面或者应该从哪台memcached查询得到数据。Memcached定期将数据同步到mysql服务器里。
优点:效率高、快速,适合处理海量数据
缺点:由于采用memcached则一旦断电则数据会丢失。
MYSQL
集群:
适合于分布式计算环境,采用代理服务器,代理服务器都是mysql服务器的一个映射。
多台mysql
服务器:
需要多少台服务器就挂多少台,功能分离。缺点:成本高,查找数据麻烦,没有高可靠性。