??xml version="1.0" encoding="utf-8" standalone="yes"?> 以前x的数据存储过E不太懂其中奥妙Q最q遇到跨数据?/a>Q同时对多个表进行CURDQCreate增、Update攏VRead诅RDelete删)Q怎么才能让繁琐的数据CURD同步变得更容易呢Q相信很多h会首先想CMySQL存储q程、触发器Q这U想法确实不错。于是饶有兴地亲自写了CUDQ增、改、删Q触发器的实例,用触发器实现多表数据同步更新?/p> 定义Q?何ؓMySQL触发器? 在MySQL Server里面也就是对某一个表的一定的操作Q触发某U条ӞInsert,Update,Delete {)Q从而自动执行的一D늨序。从q种意义上讲触发器是一个特D的存储q程。下面通过MySQL触发器实例,来了解一下触发器的工作过E吧Q?/p> 一、创建MySQL实例数据表: 在mysql的默认的试test数据库下Q创Z个表t_a与t_bQ?/p> 在t_a表上分创Z个CUDQ增、改、删Q?个触发器Q将t_a的表数据与t_b同步实现CUDQ注意创发器每个表同cM件有且仅有一个对应触发器Qؓ什么只能对一个触发器Q不解释啦,看MYSQL的说明帮助文档吧?/p> 二、创建MySQL实例触发器: 在实例数据表t_a上依ơ按照下面步骤创建tr_a_insert、tr_a_update、tr_a_delete三个触发?/p> 1、创建INSERT触发器trigger_a_insertQ?/strong> 三、测试MySQL实例触发器: 分别试实现t_a与t_b实现数据同步CUD(增、改、删)3个Triggers 1、测试MySQL的实例tr_a_insert触发器: 在t_a表中新增一条数据,然后分别查询t_a/t_b表的数据是否数据同步Q测试触发器成功标志Qt_a表无论在何种情况下,新增了一条或多条记录集时Q没有t_b表做M数据insert操作Q它同时新增了一L多条记录集?/p> 下面来进行MySQL触发器实例测试: 2、测试MySQL的实例tr_a_update、tr_a_delete触发器: q两个MySQL触发器测试原理、步骤与tr_a_insert触发器一LQ先修改/删除一条数据,然后分别查看t_a、t_b表的数据变化情况Q数据变化同步说明Trigger实例成功Q否则需要逐步排查错误原因?/p> 世界上Q何一U事物都其其优点和缺点,优点与缺Ҏ自n一个相对立的面。当然这里不是强?#8220;世界非黑即白”式的“二元?#8221;Q?#8220;存在卛_?#8221;嘛。当?MySQL触发器的优点不说了,说一下不之处,MySQL Trigger没有很好的调试、管理环境,难于在各U系l环境下试Q测试比MySQL存储q程要难Q所以徏议在生成环境下,量用存储过E来代替 MySQL触发器?/p> 本篇l束前再一下,支持触发器的MySQL版本需?.0以上Q?.0以前版本的MySQL升?.0以后版本方可使用触发器哦Q?/p>
/*Table structure for table `t_a` */
DROP TABLE IF EXISTS `t_a`;
CREATE TABLE `t_a` (
`id` smallint(1) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`groupid` mediumint(8) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;
/*Data for the table `t_a` */
LOCK TABLES `t_a` WRITE;
UNLOCK TABLES;
/*Table structure for table `t_b` */
DROP TABLE IF EXISTS `t_b`;
CREATE TABLE `t_b` (
`id` smallint(1) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) DEFAULT NULL,
`groupid` mediumint(8) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=57 DEFAULT CHARSET=latin1;
/*Data for the table `t_b` */
LOCK TABLES `t_b` WRITE;
UNLOCK TABLES;
DELIMITER $$
USE `test`$$
--判断数据库中是否存在tr_a_insert触发?br /> DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_insert`$$
--不存在tr_a_insert触发器,开始创发器
--Trigger触发条g为insert成功后进行触?br /> CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `tr_a_insert` AFTER INSERT ON `t_a`
FOR EACH ROW BEGIN
--Trigger触发后,同时对t_b新增同步一条数?br /> INSERT INTO `t_b` SET username = NEW.username, groupid=NEW.groupid;
END;
$$
DELIMITER;
DELIMITER $$
USE `test`$$
--判断数据库中是否存在tr_a_update触发?br /> DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_update`$$
--不存在tr_a_update触发器,开始创发器
--Trigger触发条g为update成功后进行触?br /> CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `tr_a_update` AFTER UPDATE ON `t_a`
FOR EACH ROW BEGIN
--Trigger触发后,当t_a表groupid,username数据有更ҎQ对t_b表同步一条更新后的数?br /> IF new.groupid != old.groupid OR old.username != new.username THEN
UPDATE `t_b` SET groupid=NEW.groupid,username=NEW.username WHEREusername=OLD.username AND groupid=OLD.groupid;
END IF;
END;
$$
DELIMITER ;
DELIMITER $$
USE `test`$$
--判断数据库中是否存在tr_a_delete触发?br /> DROP TRIGGER /*!50032 IF EXISTS */ `tr_a_delete`$$
--不存在tr_a_delete触发器,开始创发器
--Trigger触发条g为delete成功后进行触?br /> CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `tr_a_delete` AFTER DELETE ON `t_a`
FOR EACH ROW BEGIN
--t_a表数据删除后Qt_b表关联条件相同的数据也同步删?br /> DELETE FROM `t_b` WHERE username=Old.username AND groupid=OLD.groupid;
END;
$$
DELIMITER ;
--t_a表新增一条记录集
INSERT INTO `t_a` (username,groupid) VALUES ('sky54.net',123)
--查询t_a?br /> SELECT id,username,groupid FROM `t_a`
--查询t_b?br /> SELECT id,username,groupid FROM `t_b`
]]>
备䆾数据?
#mysqldump 数据库名 >数据库备份名
#mysqldump -A -u用户名 -p密码 数据库名>数据库备份名
#mysqldump -d -A --add-drop-table -uroot -p >xxx.sql
1.导出l构不导出数?
mysqldump --opt -d 数据库名 -u root -p > xxx.sql
2.导出数据不导出结?/strong>
mysqldump -t 数据库名 -uroot -p > xxx.sql
3.导出数据和表l构
mysqldump -uroot -p -B 数据库名 --table 表名 > xxx.sql
导入数据Q?
׃mysqldump导出的是完整的SQL语句Q所以用mysql客户E序很容易就能把数据导入了:
#mysql 数据库名 < 文g?
#source /tmp/xxx.sql
]]>
配置Mysql的MasterSlave臛_需要两台机器。我q里使用三台虚拟行测试。三台机器配|完全一PMySQL安装的\径也是一P
W一収ͼ10.1.5.181Q?Windows 2008 DataCenter + MySQL Community Server 5.6.10.1
W二収ͼ10.1.5.182Q?Windows 2008 DataCenter + MySQL Community Server 5.6.10.1
W三収ͼ10.1.5.183Q?Windows 2008 DataCenter + MySQL Community Server 5.6.10.1
W一?0.1.5.181用作masterQ其他两台用做slave?/p>
配置Master
?0.1.5.181q台服务器上扑ֈMySQL的配|文件my.ini。我的具体\径是在C:\ProgramData\MySQL\MySQL Server 5.6下?/p>
打开配置文gQ在最下面d如下配置Q?/p>
************************************************************************************
#Master start
#日志输出地址 主要同步使用
log-bin=master-bin.log
#同步数据?
binlog-do-db=test
#Lid 不能和从机id重复
server-id=1
#Master end
************************************************************************************
master的配|比较少Qserver-id是ؓq一lmaster/slave服务器定的唯一idQmaster/slave服务器中不能重复。在binlog-do-db中填写对象要同步的数据库Q如果有多个Q用逗号分隔Q或再写一行如binlog-do-db=test2?/p>
配置Slave
同样在第二台机器?0.1.5.181扑ֈ配置文gmy.ini。打开配置文gQ在最下面d如下配置Q?/p>
*****************************************************************************
report-host = 10.1.5.181
report-user = root
report-password = root123
log-bin = slave-bin.log
replicate-do-db = test
server-id = 2
*****************************************************************************
q里需要添加master的IPQ连接master的用户名和密码,生环境中需要新Z个用户专门来处理replicationQ这里没有新建用P用root做测试。端口没有配|,是使用默认?306Q如果端口有变化Q则通过report-port=Q来配置。log-bin是记录日志的位置?/p>
然后通过命ostart slave来启动mysql的复制功能。如果在start slaveq程中出现异常:
The server is not configured as slave; fix in config file or with CHANGE MASTER TO
可以通过下面语句解决Q?/p>
change master to master_host='10.1.5.181',master_user='root',master_password='root123',master_log_file='master-bin.000001' ,master_log_pos=120;
使用show slave status 命o来查来看q行状态。特别关注两个属性,是否?#8220;Yes”Q如果都?#8220;Yes”Q则说明q行正常?/p>
Slave_IO_RunningQ连接到dQƈdd的日志到本地Q生成本地日志文?/p>
Slave_SQL_Running:d本地日志文gQƈ执行日志里的SQL命o?/p>
同样的配|再在第三台机器上配|一下,server-id修改?。重启slave和master的mysqld服务。然后测试,在三台服务器上都保有数据库testQ然后在master服务器的test数据库上和数据,之后再两台slave上面都会看见数据的同步?/p>
Mysql的MasterSlave同步旉过二进制文件进行同步的。在Master端,你可以在C:\ProgramData\MySQL\MySQL Server 5.6\data的master-bin.log日志文g里看见所有同步的sql脚本Qmaster-bin.log是配|master时候输入的。在slave端,你可以在MySQL02-relay-bincM的文件中扑ֈ日志?br />
有h反馈之前几篇文章q于理论~少实际操作l节Q这文章就多一些可操作性的内容吧?/p>
注:q篇文章是以 MySQL 景,很多内容同时适用于其他关pd数据库,需要有一些烦引知识ؓ基础?/p>
1.减少 IO ơ数
IO永远是数据库最Ҏ瓉的地方,q是由数据库的职责所军_的,大部分数据库操作中超q?0%的时间都?IO 操作所占用的,减少 IO ơ数?SQL 优化中需要第一优先考虑Q当Ӟ也是收效最明显的优化手Dc?/p>
2.降低 CPU 计算
除了 IO 瓉之外QSQL优化中需要考虑的就?CPU q算量的优化了。order by, group by,distinct … 都是消?CPU 的大?q些操作基本上都?CPU 处理内存中的数据比较q算)。当我们?IO 优化做到一定阶D之后,降低 CPU 计算也就成ؓ了我?SQL 优化的重要目?/p>
改变 SQL 执行计划
明确了优化目标之后,我们需要确定达到我们目标的Ҏ。对?SQL 语句来说Q达Cq?个目标的Ҏ其实只有一个,那就是改?SQL 的执行计划,让他量“走弯\”Q尽量通过各种“捷径”来找到我们需要的数据Q以辑ֈ “减少 IO ơ数” ?“降低 CPU 计算” 的目?/p>
1.count(1)和count(primary_key) 优于 count(*)
很多Zؓ了统计记录条敎ͼ׃?count(1) ?count(primary_key) 而不?count(*) Q他们认h能更好Q其实这是一个误区。对于有些场景,q样做可能性能会更差,应ؓ数据库对 count(*) 计数操作做了一些特别的优化?/p>
2.count(column) ?count(*) 是一L
q个误区甚至在很多的资深工程师或者是 DBA 中都普遍存在Q很多h都会认ؓq是理所当然的。实际上Qcount(column) ?count(*) 是一个完全不一L操作Q所代表的意义也完全不一栗?/p>
count(column) 是表C结果集中有多少个column字段不ؓI的记录
count(*) 是表C整个结果集有多条记录
3.select a,b from … ?select a,b,c from … 可以让数据库讉K更少的数据量
q个误区主要存在于大量的开发h员中Q主要原因是Ҏ据库的存储原理不是太了解?/p>
实际上,大多数关pd数据库都是按照行(row)的方式存储,而数据存取操作都是以一个固定大的IO单元(被称?block 或?page)为单位,一般ؓ4KBQ?KB… 大多数时候,每个IO单元中存储了多行Q每行都是存储了该行的所有字D?lob{特D类型字D除??/p>
所以,我们是取一个字D还是多个字D,实际上数据库在表中需要访问的数据量其实是一L?/p>
当然Q也有例外情况,那就是我们的q个查询在烦引中可以完成,也就是说当只?a,b两个字段的时候,不需要回表,而cq个字段不在使用的烦引中Q需要回表取得其数据。在q样的情况下Q二者的IO量会有较大差异?/p>
4.order by 一定需要排序操?/p>
我们知道索引数据实际上是有序的,如果我们的需要的数据和某个烦引的序一_而且我们的查询又通过q个索引来执行,那么数据库一般会省略排序操作Q而直接将数据q回Q因为数据库知道数据已经满我们的排序需求了?/p>
实际上,利用索引来优化有排序需求的 SQLQ是一个非帔R要的优化手段
延阅读QMySQL ORDER BY 的实现分析,MySQL ?GROUP BY 基本实现原理以及 MySQL DISTINCT 的基本实现原理这3文章中有更为深入的分析Q尤其是W一?/p>
5.执行计划中有 filesort ׃q行盘文g排序
有这个误区其实ƈ不能怪我们,而是因ؓ MySQL 开发者在用词斚w的问题。filesort 是我们在使用 explain 命o查看一?SQL 的执行计划的时候可能会看到?“Extra” 一列显C的信息?/p>
实际上,只要一?SQL 语句需要进行排序操作,都会昄“Using filesort”Q这q不表示׃有文件排序操作?/p>
1.量?join
MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高Q但是由于其l计信息的量有限Q优化器工作q程出现偏差的可能性也更多。对于复杂的多表 JoinQ一斚w׃其优化器受限Q再者在 Join q方面所下的功夫q不够,所以性能表现?Oracle {关pd数据库前辈还是有一定距R但如果是简单的单表查询Q这一差距׃极小甚至在有些场景下要优于这些数据库前辈?/p>
2.量排?/p>
排序操作会消耗较多的 CPU 资源Q所以减排序可以在~存命中率高{?IO 能力_的场景下会较大媄?SQL 的响应时间?/p>
对于MySQL来说Q减排序有多种办法Q比如:
上面误区中提到的通过利用索引来排序的方式q行优化
减少参与排序的记录条?/p>
非必要不Ҏ据进行排?/p>
…
3.量避免 select *
很多人看到这一点后觉得比较隄解,上面不是在误Z刚刚?select 子句中字D늚多少q不会媄响到d的数据吗?
是的Q大多数时候ƈ不会影响?IO 量,但是当我们还存在 order by 操作的时候,select 子句中的字段多少会在很大E度上媄响到我们的排序效率,q一点可以通过我之前一介l?MySQL ORDER BY 的实现分析的文章中有较ؓ详细的介l?/p>
此外Q上面误Z不是也说了,只是大多数时候是不会影响?IO 量,当我们的查询l果仅仅只需要在索引中就能找到的时候,q是会极大减?IO 量的?/p>
4.量?join 代替子查?/p>
虽然 Join 性能q不佻I但是?MySQL 的子查询比v来还是有非常大的性能优势。MySQL 的子查询执行计划一直存在较大的问题Q虽然这个问题已l存在多q_但是到目前已l发布的所有稳定版本中都普遍存在,一直没有太大改善。虽然官方也在很早就承认q一问题Qƈ且承诺尽快解冻I但是臛_到目前ؓ止我们还没有看到哪一个版本较好的解决了这一问题?/p>
5.量?or
?where 子句中存在多个条件以“?#8221;q存的时候,MySQL 的优化器q没有很好的解决其执行计划优化问题,再加?MySQL Ҏ?SQL ?Storage 分层架构方式Q造成了其性能比较低下Q很多时候?union all 或者是union(必要的时?的方式来代替“or”会得到更好的效果?/p>
6.量?union all 代替 union
union ?union all 的差异主要是前者需要将两个(或者多?l果集合q后再进行唯一性过滤操作,q就会涉及到排序Q增加大量的 CPU q算Q加大资源消耗及延迟。所以当我们可以认不可能出现重复结果集或者不在乎重复l果集的时候,量使用 union all 而不?union?/p>
7.量早过?/p>
q一优化{略其实最常见于烦引的优化设计?过滤性更好的字段攑־更靠??/p>
?SQL ~写中同样可以用这一原则来优化一?Join ?SQL。比如我们在多个表进行分|据查询的时候,我们最好是能够在一个表上先qo好数据分好页Q然后再用分好页的结果集与另外的?JoinQ这样可以尽可能多的减少不必要的 IO 操作Q大大节?IO 操作所消耗的旉?/p>
8.避免cd转换
q里所说的“cd转换”是指 where 子句中出?column 字段的类型和传入的参数类型不一致的时候发生的cd转换Q?/p>
Zؓ在column_name 上通过转换函数q行转换
直接D MySQL(实际上其他数据库也会有同L问题)无法使用索引Q如果非要{换,应该在传入的参数上进行{?/p>
由数据库自己q行转换
如果我们传入的数据类型和字段cd不一_同时我们又没有做Mcd转换处理QMySQL 可能会自己对我们的数据进行类型{换操作,也可能不q行处理而交由存储引擎去处理Q这样一来,׃出现索引无法使用的情况而造成执行计划问题?/p>
9.优先优化高ƈ发的 SQLQ而不是执行频率低某些“?#8221;SQL
对于破坏性来_高ƈ发的 SQL L会比低频率的来得大,因ؓ高ƈ发的 SQL 一旦出现问题,甚至不会l我们Q何喘息的Z׃系l压跨。而对于一些虽焉要消耗大?IO 而且响应很慢?SQLQ由于频率低Q即佉K刎ͼ最多就是让整个pȝ响应慢一点,但至可能撑一会儿Q让我们有缓冲的Z?/p>
10.从全局出发优化Q而不是片面调?/p>
SQL 优化不能是单独针Ҏ一个进行,而应充分考虑pȝ中所有的 SQLQ尤其是在通过调整索引优化 SQL 的执行计划的时候,千万不能此失彼Q因失大?/p>
11.可能对每一条运行在数据库中的SQLq行 explain
优化 SQLQ需要做到心中有敎ͼ知道 SQL 的执行计划才能判断是否有优化余地Q才能判断是否存在执行计划问题。在Ҏ据库中运行的 SQL q行了一D|间的优化之后Q很明显的问?SQL 可能已经很少了,大多都需要去发掘Q这时候就需要进行大量的 explain 操作攉执行计划Qƈ判断是否需要进行优化?/p>
原文地址Qhttp://isky000.com/database/mysql-performance-tuning-sql
select * from test into outfile '/home/user/test.txt'
在linuxQcentosQ下 Q启动了mysql q给用户文gd的权?br />grant file on *.* to root@localhost;
在linuxpȝ上,目录的权限全部是 rwxrwxrwx
chmod 777 ...
/home/user/test
drwxrwxrwx
drwxrwxrwx 10 mapuser mapuser 4096 Sep
drwxrwxrwx 5 mapuser mapuser 4096 Sep
在mysql下输?br />select * from test into outfile '/home/user/test.txt'
出现错误信息Q?br />ERROR 1 (HY000): Can't create/write to file '/home/user/test.txt' (Errcode: 13)
当时如果是tmp目录的话׃会有q个错误
select * from test into outfile '/tmp/test.txt'
Query OK, 0 rows test(0.00 sec)
N只能是tmp目录吗?
有什么地方可以修改的吗?
后来吧home的所有者改成了mysql
drwxrwxrwx
select * from test into outfile '/home/test.txt'
ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)
也是同样出错?br />
q个有什么办法可以写入home目录下面吗?或者其他什么目录,只要不是tmp目录Q有先写入tmp目录Q再cp到想要的
目录Q这样做是可以,不过比较ȝQ文件比较大Q?-3G呢,
修改mysql的配|能实现吗?q是修改文g的权限,q个是什么问题呢Q?br />
select * from test into outfile '/tmp/test.txt'
Query OK, 0 rows test(0.00 sec)
看一下生的q个文g的owner 是谁?br />
启动Q?/p> 1.cd c:/mysql/bin 2.mysqld --console 关闭Q?/p> 1.cd c:/mysql/bin 2.mysqladmin -uroot shutdown q可以: 启动Q?/p> 1.cd c:/mysql/bin 2.net start mysql5 关闭Q?/p> 1.cd c:/mysql/bin 2.net stop mysql5 在linux下: 采用netstat -nlp查看mysql服务的状?/p> 命o行方式: 开?nbsp; ./mysqld_safe & 关闭 mysqladmin -uroot shutdown rpm方式安装?/p> 开?nbsp; service mysql start 关闭 service mysql stop 在命令行启动mysqlӞ如不?--console"Q启动、关闭信息不在界面中昄Q而是记录在安装目录下的data目录里,文g名一般是hostname.err,通过此文件查看mysql的控制台信息?/p>
select * from test into outfile '/home/test.txt'
ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)
------------------------
从Errcode: 13来看是没权限
你执行上面语句时Q是用什么用h行的呢?查下q个用户是否有权限吧
估计和权限没关系Q因为已l是777了?br />
看看是不是selinux打开了,如果没什么特别需要的话,关了为好?br />
非root用户Q在mysql下执行的select * from test into outfile '/home/user/test.txt'
select * from test into outfile '/home/user/test.txt'该语句生的文g?br />-rw-rw-rw-
mysqll的mysql用户的?br />
貌似和权限没什么关p,我用root用户登陆pȝQ执行mysql的语句,其结果还是一P写入/home目录?br />select * from test into outfile '/home/test.txt'
ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)
q是有这个问题?br />selinux会阻止其他程序写入操作?Q?br />具体怎么改变一下selinx的配|呢
我理清是什么问题了?br />在red hatpd的linux中selinux对哪些daemon可以q行怎么L操作是有限制的,mysql的select into outfile的命令是mysql的daemon来负责写文g操作的。写文g之前当然要具有写文g的权限。而selinux对这个权限做了限制。如?selinux是关闭的吧,q个命o执行是没有问题的
mysql> select user from user into outfile '/home/test.txt';
Query OK, 2 rows affected (0.02 sec)
当时selinux开启时
selinux对mysql的守护进Emysqldq行了限制?br />mysql> select user from user into outfile '/home/test.txt';
ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)
出现了没有权限写的error?br />解决ҎQ可以关闭selinux?br />可以?etc/selinux中找到config
root用户Q?br />shell>vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#
#
#
SELINUX=enforcing
修改SELINUX=disabled关闭selinux可以了Q这个问题就可以解决了?br />不过全部关闭SELINUX有带来一些安全问题?br />当然也可以,单独lmysql的守护进E权限,
shell>getsebool -a可以查看当前的对pȝ一pd守护q程的权限情c?br />
lpd_disable_trans --> off
mail_read_content --> off
mailman_mail_disable_trans --> off
mdadm_disable_trans --> off
mozilla_read_content --> off
mysqld_disable_trans --> off
nagios_disable_trans --> off
named_disable_trans --> off
named_write_master_zones --> off
nfs_export_all_ro --> on
nfs_export_all_rw --> on
nfsd_disable_trans --> off
nmbd_disable_trans --> off
nrpe_disable_trans --> off
shell>setsebool -P mysqld_disable_trans=1
开启对mysql守护q程的权限,q样
mysql> select user from user into outfile '/home/test.txt';
写入到自定义的目录就没有问题了?br />-P表示 是永久性设|,否则重启之后又恢复预讑ր{?br />getsebool setsebool命o在root用户下有权限?br />
除了对selinux的权限,当然首先要保证该目录拥有d权限?br />
在ubuntu?Q可以对AppArmor(/etc/apparmor.d/usr.sbin.mysqld) 修改Q类似selinux?br />d/etc/squid/lists/eighties.txt w,cM?/p>
]]>
索引作ؓ数据库开发的一个重要方面,对于讉K性能以及能否支持高ƈ发,?/span>tps的应用,L军_性作用?/span>Innodb存储引擎支持B+树烦引以及自适应哈希索引Q其中后者是?/span>innodb引擎Ҏ表的使用情况自动生成Q无法进行h为创建?/span>
B+树烦引是目前关系型数据库中最常见最有效的烦引,是基于二分查找而Ş成的一^衡术l构。我们来逐步了解?br />MySQL普遍用B+Tree实现其烦引结?br />
索引的主要作用:
1、快速定位记?br />2、避免排序和使用临时?br />3、可以将随机IO变ؓ序IO
InnoDB存储引擎会监控对表上索引的查找,如果观察到徏立哈希烦引可以带来速度的提升,则徏立哈希烦引,所以称之ؓ自适应QadaptiveQ的。自适应哈希索引通过~冲池的B+树构造而来Q因此徏立的速度很快。而且不需要将整个表都建哈希烦引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引?/p>
ҎInnoDB的官Ҏ档显C,启用自适应哈希索引后,d和写入速度可以提高2倍;对于辅助索引的连接操作,性能可以提高5倍。在我看来,自适应哈希索引是非常好的优化模式,其设计思想是数据库自优化(self-tuningQ,x需DBAҎ据库q行调整?/p>
通过命oSHOW ENGINE INNODB STATUS可以看到当前自适应哈希索引的用状况,如下所C:
现在可以看到自适应哈希索引的用信息了Q包括自适应哈希索引的大、用情c每U用自适应哈希索引搜烦的情c值得注意的是Q哈希烦引只能用来搜索等值的查询Q如select * from table where index_col = 'xxx'Q而对于其他查扄型,如范围查找,是不能用的。因此,q里出现了non-hash searches/s的情c用hash searches : non-hash searches命o可以大概了解使用哈希索引后的效率?/p>
׃自适应哈希索引是由InnoDB存储引擎控制的,所以这里的信息只供我们参考。不q我们可以通过参数innodb_adaptive_hash_index来禁用或启动此特性,默认为开启?/p>
转自http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html
创徏索引、优化查询以便达到更好的查询优化效果。但实际上,MySQL有时q不按我们设计的那样执行查询。MySQL是根据统计信息来生成执行计划的,q就涉及索引及烦引的刷选率Q表数据量,q有一些额外的因素?/p>
Each table index is queried, and the best index is used unless the optimizer believes that it is more efficient to use a table scan. At one time, a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size.
而言之,当MYSQL认ؓW合条g的记录在30%以上Q它׃会再使用索引Q因为mysql认ؓ走烦引的代h比不用烦引代价大Q所以优化器选择了自pZh的方式。事实也的确如此
切分主要有两U方式:水^切分QHorizental ShardingQ和垂直切分QVertical ShardingQ?br />
水^切分所指的是通过一pd的切分规则将数据水^分布C同的DB或table中,在通过相应的DB路由 或者table路由规则扑ֈ需要查询的具体的DB或者table以进行Query操作Q比如根据用户ID用戯切分到多台数据库上?br />
垂直切分指的是按业务、品切分,不同类型的数据且分C同的服务器上Q通过数据库代理疏通程序与多个数据库的通讯、降低应用的复杂度?br />
d分离单的说是把对数据库读和写的操作分开对应不同的数据库服务器,q样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作Q从数据库提供读操作Q这h避免了主数据库服务器QMasterQ的q蝲Q也有效地利用了从数据库服务器(SlaveQ的资源?/p>
q里ebay工程师的文章Q?a target="_top" style="color: #3fa7cb;">《可伸羃性最佛_践:来自eBay的经验?/a>更详l地介绍了一些概念及业务场景?/p>
--End--
如果您指定了ON DUPLICATE KEY UPDATEQƈ且插入行后会D在一个UNIQUE索引或PRIMARY KEY中出现重复|则执行旧行UPDATE?/span>
例如Q如果列a被定义ؓUNIQUEQƈ且包含?Q则以下两个语句h相同的效果:
insert into abin1 (id,username,password) values (1,'abin1','varyall1') on duplicate key update username='abin12',password='varyall12';
其次再说主键Qprimary keyQ类型的Q?br />create table abin2(
id int not null,
username varchar(100),
password varchar(100),
constraint pk_abin2 primary key(id)
)执行语句Q?br />insert into abin2 (id,username,password) values (1,'abin1','varyall1') on duplicate key update username='abin12',password='varyall12';
2、插入单行记录:如果不存在插入记录,如果存在记录的话Q就不再插入
insert into abin2 (id,username,password) select 1,'abin12','varyall12' from dual
where not exists (select k.* from abin2 k where k.id=1)
3?span style="font-size:16px; color:#000000">CZ一Q插入多条记?/span>假设有一个主键ؓ id ?abin2表,可以使用下面的语句:
insert into abin2 (id,username,password) select 1,'abin12','varyall12' from dual
where not exists (select k.* from abin2 k where k.id=1)
4?div>我们在?a target="_self">数据?/span>时可能会l常遇到q种情况。如果一个表在一个字D上建立了唯一索引Q当我们再向q个表中使用已经存在的键值插入一条记录,那将会抛Z个主键冲H的
错误。当Ӟ我们可能想用新记录的值来覆盖原来的记录倹{如果用传l的做法Q必d使用DELETE语句删除原先的记录,然后再用INSERT插入新的记录。而在MySQL中ؓ
我们提供了一U新的解x案,q就是REPLACE语句。用REPLACE插入一条记录时Q如果不重复QREPLACE和INSERT的功能一P如果有重复记录,REPLACE׃用新记录的?br />来替换原来的记录倹{?br />
具体用法Q?br />replace into abin2 (id,username,password) values (2,'abin','varyall')
NOW()函数以`'YYYY-MM-DD HH:MM:SS'q回当前的日期时_可以直接存到DATETIME字段中?br style="margin: 0px; padding: 0px;" />CURDATE()?#8217;YYYY-MM-DD’的格式返回今天的日期Q可以直接存到DATE字段中?br style="margin: 0px; padding: 0px;" />
CURTIME()?#8217;HH:MM:SS’的格式返回当前的旉Q可以直接存到TIME字段中?/span>
create table abin6 like abin5;
建立触发器:
CREATE TRIGGER `tabin1` BEFORE DELETE ON `abin5` FOR EACH ROW begin
declare id int default 0;
declare name varchar(100) default null;
set id=OLD.id;
set name=OLD.name5;
insert into abin6 values (id,name);
end;
试语句Q?br />delete from abin5 where id='1';
然后查看abin6表里面,必定是新增了一条和abin5表里面删除掉的一模一L记录?br />
W一部分Q关于insert的触发器执行
Q?br />create table abing(
id int not null auto_increment,
name varchar(100),
constraint pk primary key(id)
)
建立触发器:Q用于主键自增)
create trigger tabing before insert on abing for each row
begin
set @id=new.id;
end
执行insert语句Q?br />insert into abing (name) values ('abing');
查看l果Q?br />select * from abing
呵呵Q结果是自然主键自增了?br />
W一部分Q关于update的触发器执行
Q?br />create table abing(
id int not null auto_increment,
name varchar(100),
sid int,
constraint pk primary key(id)
)
建立触发器:
create trigger tabing before update on abing for each row
begin
set @old=old.sid;
set @new=new.sid;
end
参考资料:http://database.51cto.com/art/201010/229404.htm
fetch mycur into id,az;
if status = 0 then
if az is not null then
set ax=CONCAT(az,'mycur');
else
set ax=CONCAT('mysql','mycur');
end if;
insert into abin5 values (id,ax);
end if;
if status = 1 then
leave loopLabel;
end if;
end loop;
close mycur;
END
2、测试语?br />
call pabin4()
q几个@环语句的格式如下Q?br />WHILE……DO……END WHILE
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
GOTO?/p>1、徏立存储过E?br />create procedure pabin2()
BEGIN
declare i int ;
set i=0;
while i<5 do
insert into abin5 values (i,CONCAT('while',i));
set i=i+1;
end while;
END
试语句Q?br />call pabin2()
2、徏立存储过E:
create procedure pabin3()
BEGIN
declare i int ;
declare az varchar(100) default '';
set i=0;
repeat
set az=CONCAT('repeat',i);
insert into abin5 values (i,az);
set i=i+1;
until i>=5
end repeat;
end
试语句Q?br />call pabin3()
3、徏立存储过E:
create procedure pabin1()
begin
declare i int default 0;
declare av varchar(100) default '';
loop_label:LOOP
if i=3 then
set i=i+1;
iterate loop_label;
end if;
set av=CONCAT('loop',i);
insert into abin5 values (i,av);
set i=i+1;
if i>=5 then
leave loop_label;
end if;
end loop;
end;
试语句Q?br />call pabin1()
ENUM
cd
ENUM
是一个字W串对象Q其值通常选自一个允许值列表中Q该列表在表创徏时的列规D明中被明地列D?/p>
在下列某些情况下Qg可以是空?""
) ?NULL
Q?/p>
ENUM
(卻I一个不在允许值列表中的字W串)Q空字符串将作ؓ一个特D的错误D插入。事实上Q这个字W串有别于一?普通的"I字W串Q因个字W串有个数字索引gؓ 0。稍后有更详l描q?/li>ENUM
被声明ؓ NULL
Q?code>NULL 也是该列的一个合法|q且该列的缺省gؓ NULL
。如果一?ENUM
被声明ؓ NOT NULL
Q该列的~省值将是该列表所允许值的W一个成员?每个枚D值均有一个烦引|
SELECT
语句扑և被赋于无?ENUM
值的记录行?mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL
值的索引gؓ NULL
?例如Q指定ؓ ENUM("one", "two", "three")
的一个列Q可以有下面所昄的Q一倹{每个值的索引g如下所C:
? | 索引? |
NULL |
NULL |
"" |
0 |
"one" |
1 |
"two" |
2 |
"three" |
3 |
换个枚D最大可以有 65535 个成员倹{?/p>
?MySQL 3.23.51 开始,当表被创建时Q?code>ENUM 值尾部的I格会自动删除?/p>
当ؓ一?ENUM
列赋值时Q字母的大小写是无关紧要的。然而,以后从列中检索出来的值的大小写却是匹配于创徏表时所指定的允许倹{?/p>
如果在一个数字语境中索一?code>ENUMQ列值的索引值将被返回。例如,你可以像q样使用数字值检索一?ENUM
列:
mysql> SELECT enum_col+0 FROM tbl_name;
如果一个数字存储到一?ENUM
中,数字被当作ؓ一个烦引|q且存储的值是该烦引值所对应的枚举成员?但是Q这?LOAD DATA
不能工作,因ؓ它视所有的输入均ؓ字符丌Ӏ? 在一?ENUM
字符串中存储数字是不明智的,因ؓ它可能会打ؕ思维?/p>
ENUM
g照列规格说明中的列表序q行排序?换句话说Q?code>ENUM g照它们的索引h序?举例来说Q对?ENUM("a", "b")
"a"
排在 "b"
后,但是对于 ENUM("b", "a")
Q?code> "b" 却排?"a"
之前。空字符串排在非I字W串前,NULL
值排在其它所有的枚D值前。ؓ了防止意想不到的l果Q徏议依照字母的序定义 ENUM
列表。也可以通过使用 GROUP BY CONCAT(col)
来确定该以字母顺序排序而不是以索引倹{?/p>
如果希望得到一?ENUM
列的所有可能|可以使用 SHOW COLUMNS FROM table_name LIKE enum_colum