??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久一区二区,亚洲成人二区,在线亚洲欧美http://www.aygfsteel.com/stevenjohn/category/51104.html那些青春的岁?/description>zh-cnThu, 18 Aug 2016 11:37:32 GMTThu, 18 Aug 2016 11:37:32 GMT60MySQL触发器Trigger实例?http://www.aygfsteel.com/stevenjohn/archive/2016/08/18/431625.htmlabinabinThu, 18 Aug 2016 09:25:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2016/08/18/431625.htmlhttp://www.aygfsteel.com/stevenjohn/comments/431625.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2016/08/18/431625.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/431625.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/431625.html
MySQL触发器Trigger实例?/div>
发表?68 天前 ⁄ IT技?/a> ⁄ 暂无评论

以前x的数据存储过E不太懂其中奥妙Q最q遇到跨数据?/a>Q同时对多个表进行CURDQCreate增、Update攏VRead诅RDelete删)Q怎么才能让繁琐的数据CURD同步变得更容易呢Q相信很多h会首先想CMySQL存储q程、触发器Q这U想法确实不错。于是饶有兴地亲自写了CUDQ增、改、删Q触发器的实例,用触发器实现多表数据同步更新?/p>

MySQL触发器Trigger实例? title=

定义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>



    /*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;

在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>



    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;
2、创建UPDATE触发器trigger_a_updateQ?/strong>


    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 ;
3、创建DELETE触发器trigger_a_deleteQ?/strong>


    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 ;

三、测试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触发器实例测试:



    --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`

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>








http://blog.csdn.net/hireboy/article/details/18079183





abin 2016-08-18 17:25 发表评论
]]>
mysql mysqldumphttp://www.aygfsteel.com/stevenjohn/archive/2015/09/05/427124.htmlabinabinFri, 04 Sep 2015 17:12:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/09/05/427124.htmlhttp://www.aygfsteel.com/stevenjohn/comments/427124.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/09/05/427124.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/427124.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/427124.html
mysqldump --opt -d 数据库名 -u root -p > xxx.sql 

备䆾数据?

#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 > xxx.sql  
4.导出特定表的l构
mysqldump -uroot -p -B 数据库名 --table 表名 > xxx.sql  
导入数据Q?
  ׃mysqldump导出的是完整的SQL语句Q所以用mysql客户E序很容易就能把数据导入了:
#mysql 数据库名 < 文g?
#source /tmp/xxx.sql   













abin 2015-09-05 01:12 发表评论
]]>
Windows下Mysql5.6.10 Master Slave配置http://www.aygfsteel.com/stevenjohn/archive/2015/08/10/426701.htmlabinabinSun, 09 Aug 2015 19:26:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/08/10/426701.htmlhttp://www.aygfsteel.com/stevenjohn/comments/426701.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/08/10/426701.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/426701.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/426701.html环境

配置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 />

http://www.cnblogs.com/haoxinyue/archive/2013/04/02/2995280.html


abin 2015-08-10 03:26 发表评论
]]>
mysql 分组排序http://www.aygfsteel.com/stevenjohn/archive/2015/04/17/424484.htmlabinabinThu, 16 Apr 2015 17:29:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/04/17/424484.htmlhttp://www.aygfsteel.com/stevenjohn/comments/424484.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/04/17/424484.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/424484.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/424484.html
CREATE TABLE `student` (                                  
           `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',      
           `name` varchar(100) DEFAULT NULL COMMENT 'name',        
           `ban` varchar(100) DEFAULT NULL COMMENT 'ban',          
           `score` int(11) DEFAULT NULL,                           
           PRIMARY KEY (`id`),                                     
           KEY `inx_ban` (`ban`)                                   
         ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1  

nameQ学生名
banQ班U?br />scoreQ分?br />1、按班分组排序Q取出分数前两名的同学?br />
select t.ban,t.score,t.name from student t where 2<(select count(*) from student k where k.ban=t.ban and t.score>k.score order by k.ban desc) order by t.ban,t.score desc;
CZ如下Q?br />
one 100 abin1
one 99 abin2
three 100 varyall1
three 99 varyall2
two 100 lee1
two 99 lee2
2、按l统计出来每l的所有分l,用逗号隔开
select t.ban,group_concat(t.score) from student t group by t.ban
CZ如下Q?/div>
one 100,99,97,95,91
three 100,99,97,95,91
two 100,99,97,95,91





abin 2015-04-17 01:29 发表评论
]]>mysql sql优化http://www.aygfsteel.com/stevenjohn/archive/2015/04/08/424231.htmlabinabinWed, 08 Apr 2015 13:33:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/04/08/424231.htmlhttp://www.aygfsteel.com/stevenjohn/comments/424231.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/04/08/424231.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/424231.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/424231.html1、selectq些关键字大写,否则Q系l会自动的{化ؓ大写才去执行sql的解释执行计划?br />2、如果需要字D少的话选择select a,b,c from table ,量用select * from table.
3、尽量少使用!=?lt;>因ؓ不会使用到烦引?br />4、尽量少使用orQ不会用到索引.
5、避免用is not null 和not in,likeQ不会用到索引?br />6、避免全表扫描,在where和order by 上面建立索引?br />7、应量避免?where 子句中对字段q行表达式操作,q将D引擎攑ּ使用索引而进行全表扫描。如Q?
select id from t where num/2=100
应改?
select id from t where num=100*2
8、应量避免在where子句中对字段q行函数操作Q这导致引擎放弃用烦引而进行全表扫描?br />9、不要在 where 子句中的“=”左边q行函数、算术运或其他表达式运,否则pȝ可能无法正用烦引?br />






















abin 2015-04-08 21:33 发表评论
]]>
二叉?>B-tree->b+tree->b+tree改良http://www.aygfsteel.com/stevenjohn/archive/2015/04/07/424205.htmlabinabinTue, 07 Apr 2015 14:39:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/04/07/424205.htmlhttp://www.aygfsteel.com/stevenjohn/comments/424205.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/04/07/424205.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/424205.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/424205.html二叉?>b-树,解决的是ȝ引的IOơ数问题

在真实的数据库中
往往索引本n的数据量也是非常庞大?/div>树的查找Q其实是每一层需要做一ơ判?/span>
因ؓ索引很大Q只能存在文仉Q不能一ơ加载,所以没判断一层,都需要有一ơ磁盘IOQ所以查找IOơ数最坏的情况
是树的高度-1Q加入你要的节点在最后一层的?/div>二叉树,是只有两个子节点?/span>
一单数据量一大的?/div>树高会很恐?/span>
B-TreeQ的度是没有限制?/div>可以打打减少q个数的高度Q从而减磁盘读的次?/span>


b-tree -> b+tree :q个是针对IO的再ơ优?/div>
b+treeQ的父节Ҏ不存数据?/div>
 数据库烦引,其实一个节点刚好占的是盘的一늩?/div>
 ׃索引节点不存数据
 一个硬盘页Q也是一个节点的度就可以更大
 可以最大程度减树的高?/div>
 之所以一个节点刚好占一,也是IO的问题,一ơ硬盘IO只能M?/div>
 q是l构上的改进
 效果是一个节点一ơIO的度更大?/div>
 他这个意思就是说Q如果有索引Q一ơ烦引查找,基本不会过2ơ硬盘IO
 q还只是b-tree
 b-treeq玩意儿pB?/div>
 很多B减数是误?/div>

























abin 2015-04-07 22:39 发表评论
]]>MySQL垂直和水q_?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423793.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Tue, 24 Mar 2015 08:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423793.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/423793.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/423793.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/423793.html</trackback:ping><description><![CDATA[replication的限?一旦数据库q于庞大Q尤其是当写入过于频J,很难׃C机支撑的时候,我们q是会面临到扩展瓉。数据切?sharding):通过某种特定的条Ӟ我们存攑֜同一个数据库中的数据分散存放到多个数据库Q主机)上面Q以辑ֈ分散单台讑֤负蝲的效果。。数据的切分同时q可以提高系l的M可用性,因ؓ单台讑֤Crash之后Q只有M数据的某部分不可用,而不是所有的数据?br /><br /><u><em><strong>数据的切分(ShardingQ模?br /></strong></em></u><br />一U是按照不同的表Q或者SchemaQ来切分C同的数据库(LQ之上,q种切可以称之ؓ数据的垂_U向Q切分;另外一U则是根据表中的数据的逻辑关系Q将同一个表中的数据按照某种条g拆分到多台数据库Q主机)上面Q这U切分称之ؓ数据的水qI横向Q切分?br /><br /><u><em><strong>垂直切分:</strong></em></u><br /><br />一个架构设计较好的应用pȝQ其M功能肯定是由很多个功能模块所l成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块怺之间的交互点统一少Q系l的耦合度就低Q系l各个模块的l护性以及扩展性也p好。这LpȝQ实现数据的垂直切分也就容易?br /><br />一般来_如果是一个负载相对不是很大的pȝQ而且表关联又非常的频J,那可能数据库让步Q将几个相关模块合ƈ在一起减应用程序的工作的方案可以减较多的工作量,q是一个可行的Ҏ。一个垂直拆分的例子:<br /><br />1.用户模块表:user,user_profile,user_group,user_photo_album<br />2.组讨论表:groups,group_message,group_message_content,top_message<br />3.相册相关表:photo,photo_album,photo_album_relation,photo_comment<br />4.事g信息表:event<br /><br /><br /> <ul> <li><em>组讨论模块和用h块之间主要存在通过用户或者是组关系来进行关联。一般关联的时候都会是通过用户的id或者nick_name以及group的id来进行关联,通过模块之间的接口实C会带来太多麻烦;</em> </li><li><em>相册模块仅仅与用h块存在通过用户的关联。这两个模块之间的关联基本就有通过用户id兌的内容,单清晎ͼ接口明确Q?/em> </li><li><em>事g模块与各个模块可能都有关联,但是都只x其各个模块中对象的ID信息Q同样可以做到很Ҏ分拆?/em> </li></ul><br /><u><em><strong>垂直切分的优?/strong></em></u><br /><br /> <ul> <li><em>数据库的拆分单明了,拆分规则明确Q?/em> </li><li><em>应用E序模块清晰明确Q整合容易;</em> </li><li><em>数据l护方便易行Q容易定位;</em> </li></ul><u><em><strong><br />垂直切分的缺?/strong></em></u><br /><br /> <ul> <li><em>部分表关联无法在数据库别完成,需要在E序中完?em>Q?/em> </em> </li><li><em>对于讉K极其频繁且数据量大的表仍然存在性能瓉Q不一定能满要求Q?/em> </li><li><em>事务处理相对更ؓ复杂<em>Q?/em> </em> </li><li><em>切分辑ֈ一定程度之后,扩展性会遇到限制Q?/em> </li><li><em>q读切分可能会带来系l过渡复杂而难以维护?/em> </li></ul><br /><u><em><strong>水^切分</strong></em></u><br /><br />某个访问极光J的表再按照某个字段的某U规则来分散到多个表之中Q每个表中包含一部分数据?br /><br />对于上面的例?所有数据都是和用户兌的,那么我们可以根据用hq行水^拆分Q将不同用户的数据切分到不同的数据库中?br /><br />现在互联|非常火爆的Web2.0cd的网站,基本上大部分数据都能够通过会员用户信息兌上,可能很多核心表都非常适合通过会员ID来进行数据的水^切分。而像论坛C֌讨论pȝQ就更容易切分了Q非常容易按照论坛编hq行数据的水q_分。切分之后基本上不会出现各个库之间的交互?br /><u><em><strong><br />水^切分的优?/strong></em></u><br /><br /> <ul> <li><em>表关联基本能够在数据库端全部完成Q?/em> </li><li><em>不会存在某些大型数据量和高负蝲的表遇到瓉的问题;</em> </li><li><em>应用E序端整体架构改动相对较;</em> </li><li><em>事务处理相对单;</em> </li><li><em>只要切分规则能够定义好,基本上较N到扩展性限Ӟ</em> </li></ul><br /><u><em><strong>水^切分的缺?/strong></em></u><br /><br /> <ul> <li><em>切分规则相对更ؓ复杂Q很难抽象出一个能够满x个数据库的切分规则;</em> </li><li><em>后期数据的维护难度有所增加Qh为手工定位数据更困难Q?/em> </li><li><em>应用pȝ各模块耦合度较高,可能会对后面数据的迁UL分造成一定的困难?/em> </li></ul><br /><u><em><strong>两种切分l合?</strong></em></u><br /><br />一般来_我们数据库中的所有表很难通过某一个(或少数几个)字段全部兌hQ所以很隄单的仅仅通过数据的水q_分来解决所有问题。而垂直切分也只能解决部分问题Q对于那些负载非帔R的系l,即仅仅只是单个表都无法通过单台数据库主机来承担其负载。我们必ȝ?#8220;垂直”?#8220;水^”两种切分方式同时使用<br /><br />每一个应用系l的负蝲都是一步一步增长上来的Q在开始遇到性能瓉的时候,大多数架构师和DBA都会选择先进行数据的垂直拆分Q因L成本最先,最W合q个时期所q求的最大投入出比。然而,随着业务的不断扩张,pȝ负蝲的持l增长,在系l稳定一D|期之后,l过了垂直拆分之后的数据库集可能又再一ơ不堪重负,遇到了性能瓉?br /><br />如果我们再一ơ像最开始那Ll细分模块,q行数据的垂直切分,那我们可能在不久的将来,又会遇到现在所面对的同L问题。而且随着模块的不断的l化Q应用系l的架构也会来复杂,整个pȝ很可能会出现失控的局面?br /><br />q时候我们就必须要通过数据的水q_分的优势Q来解决q里所遇到的问题。而且Q我们完全不必要在用数据水q_分的时候,推倒之前进行数据垂直切分的成果Q而是在其基础上利用水q_分的优势来避开垂直切分的弊端,解决pȝ复杂性不断扩大的问题。而水qx分的弊端Q规则难以统一Q也已经被之前的垂直切分解决掉了Q让水^拆分可以q行的得心应手?br /><br />CZ数据?<br /><br />假设在最开始,我们q行了数据的垂直切分Q然而随着业务的不断增长,数据库系l遇C瓉Q我们选择重构数据库集的架构。如何重构?考虑C前已l做好了数据的垂直切分,而且模块l构清晰明确。而业务增长的势头来猛Q即使现在进一步再ơ拆分模块,也坚持不了太久?br /><br />==>选择了在垂直切分的基上再q行水^拆分?br /><br />==>在经历过垂直拆分后的各个数据库集中的每一个都只有一个功能模块,而每个功能模块中的所有表基本上都会与某个字段q行兌。如用户模块全部都可以通过用户IDq行切分Q群l讨论模块则都通过组ID来切分,相册模块则根据相册ID来进切分Q最后的事g通知信息表考虑到数据的旉性(仅仅只会讉K最q某个事件段的信息)Q则考虑按时间来切分?br /><br /><u><em><strong>数据切分以及整合Ҏ.</strong></em></u><br /><br />数据库中的数据在l过垂直和(或)水^切分被存攑֜不同的数据库L之后Q应用系l面临的最大问题就是如何来让这些数据源得到较好的整合,其中存在两种解决思\Q?br /><br /> <ul> <li><em>在每个应用程序模块中配置理自己需要的一个(或者多个)数据源,直接讉K各个数据库,在模块内完成数据的整合;</em> </li><li><em>通过中间代理层来l一理所有的数据源,后端数据库集对前端应用E序透明Q?/em> </li></ul><br />W二U方?虽然短期内需要付出的成本可能会相Ҏ大一些,但是Ҏ个系l的扩展性来_是非常有帮助的。针对第二种ҎQ可以选择的方法和思\有:<br /><br /><u><em><strong>1.利用MySQLProxy 实现数据切分及整?</strong></em></u><br /><br />可用来监视、分析或者传输他们之间的通讯信息。他的灵zL允怽最大限度的使用它,目前具备的功能主要有q接路由QQuery分析QQueryqo和修改,负蝲均衡Q以及基本的HA机制{。MySQLProxy 本nq不h上述所有的q些功能Q而是提供了实Cq功能的基础。要实现q些功能Q还需要通过我们自行~写LUA脚本来实现?br /><br />原理:MySQLProxy 实际上是在客Lh与MySQLServer 之间建立了一个连接池。所有客Lh都是发向MySQLProxyQ然后经由MySQLProxy q行相应的分析,判断出是L作还是写操作Q分发至对应的MySQLServer 上。对于多节点Slave集群Q也可以起做到负载均衡的效果?br /><br /><u><em><strong>2.利用Amoeba实现数据切分及整?/strong></em></u><br /><br />Amoeba是一个基于Java开发的Q专注于解决分布式数据库数据源整合ProxyE序的开源框ӞAmoeba已经hQuery路由QQueryqoQ读写分,负蝲均衡以及HA机制{相兛_宏VAmoeba主要解决的以下几个问题:<br /><br /> <ul> <li><em>数据切分后复杂数据源整合Q?/em> </li><li><em>提供数据切分规则q低数据切分规则给数据库带来的影响Q?/em> </li><li><em>降低数据库与客户端的q接敎ͼ</em> </li><li><em>d分离路由Q?/em> </li></ul><br />AmoebaFor MySQL 主要是专门针对MySQL数据库的解决ҎQ前端应用程序请求的协议以及后端q接的数据源数据库都必须是MySQL。对于客L的Q何应用程序来_AmoebaForMySQL 和一个MySQL数据库没有什么区别,M使用MySQL协议的客LhQ都可以被AmoebaFor MySQL 解析q进行相应的处理?br /><br />ProxyE序常用的功能如d分离Q负载均衡等配置都在amoeba.xml中进行。Amoeba已经支持了实现数据的垂直切分和水q_分的自动路由Q\p则可以在rule.xmlq行讄?br /><u><em><strong><br />3.利用HiveDB实现数据切分及整?/strong></em></u><br /><br />HiveDB同样是一个基于Java针对MySQL数据库的提供数据切分及整合的开源框Ӟ只是目前的HiveDB仅仅支持数据的水q_分。主要解军_数据量下数据库的扩展性及数据的高性能讉K问题Q同时支持数据的冗余及基本的HA机制?br /><br />HiveDB的实现机制与MySQLProxy 和Amoeba有一定的差异Q他q不是借助MySQL的Replication功能来实现数据的冗余Q而是自行实现了数据冗余机Ӟ而其底层主要是基于HibernateShards 来实现的数据切分工作。数据切分与整合中可能存在的问题<br /><br /><u><em><strong>引入分布式事务的问题?</strong></em></u><br /><br />一旦数据进行切分被分别存放在多个MySQLServer中之后,不管我们的切分规则设计的多么的完(实际上ƈ不存在完的切分规则Q,都可能造成之前的某些事务所涉及到的数据已经不在同一个MySQLServer 中了?br /><br />==>一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务Qƈ通过应用E序来L各个事务?br /><u><em><strong><br />跨节点Join的问?</strong></em></u><br /><br />==>先从一个节点取出数?然后Ҏq些数据,再到另一个表中取数据.<br />==>使用Federated存储引擎,问题?乎如果远端的表结构发生了变更Q本地的表定义信息是不会跟着发生相应变化的?br /><br /><u><em><strong>跨节点合q排序分问?</strong></em></u><br /><br />==>Join本n涉及到的多个表之间的数据d一般都会存在一个顺序关pR但是排序分就不太一样了Q排序分늚数据源基本上可以说是一个表Q或者一个结果集Q,本nq不存在一个顺序关p,所以在从多个数据源取数据的q程是完全可以ƈ行的。这P排序分页数据的取数效率我们可以做的比跨库Join更高Q所以带来的性能损失相对的要更小? <img src ="http://www.aygfsteel.com/stevenjohn/aggbug/423793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2015-03-24 16:13 <a href="http://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL SQL优化ȝ http://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423792.htmlabinabinTue, 24 Mar 2015 07:51:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423792.htmlhttp://www.aygfsteel.com/stevenjohn/comments/423792.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/03/24/423792.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/423792.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/423792.html前言

有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



abin 2015-03-24 15:51 发表评论
]]>
mysql查询l果导出到文?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422735.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Wed, 04 Feb 2015 06:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422735.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/422735.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422735.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/422735.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/422735.html</trackback:ping><description><![CDATA[<div>Ҏ一Q?/div><div>直接执行命oQ?/div><div>mysql> select count(1) from table   into outfile '/tmp/test.xls';</div><div>Query OK, 31 rows affected (0.00 sec)</div><div>在目?tmp/下会产生文gtest.xls</div><div>遇到的问题:</div><div>mysql> select count(1) from table   into outfile '/data/test.xls';</div><div>报错Q?/div><div>ERROR 1 (HY000): Can't create/write to file '/data/test.xls' (Errcode: 13)</div><div>可能原因Qmysql没有?data/下写的权限,没有q</div><div></div><div>Ҏ二:</div><div>查询都自动写入文Ӟ</div><div>mysql> pager cat > /tmp/test.txt ;</div><div>PAGER set to 'cat > /tmp/test.txt'</div><div>之后的所有查询结果都自动写入/tmp/test.txt'Qƈ前后覆盖</div><div>mysql> select * from table ;</div><div>30 rows in set (0.59 sec)</div><div>在框口不再显C查询结?/div><div>以上参考:http://blog.163.com/cpu_driver/blog/static/117663448201111295420990/</div><div></div><div>Ҏ三:</div><div>跛_mysql命o?/div><div>[root@SHNHDX63-146 ~]# mysql -h127.0.0.1 -uroot -pXXXX -P3306 -e"select * from table" > /tmp/test/txt</div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/422735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2015-02-04 14:50 <a href="http://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql解决select ... into outfile '..' mysql写文件权限问?http://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422733.htmlabinabinWed, 04 Feb 2015 06:31:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422733.htmlhttp://www.aygfsteel.com/stevenjohn/comments/422733.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/02/04/422733.html#Feedback1http://www.aygfsteel.com/stevenjohn/comments/commentRss/422733.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/422733.htmlselect FQQ,FScoreCount from Tbl_User into outfile "/tmp/terminatedtest.txt" fields terminated by ",";



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  4 root root  4096 Sep  3 18:42 home
drwxrwxrwx 10 mapuser mapuser 4096 Sep  4 03:41 user
drwxrwxrwx 5 mapuser mapuser 4096 Sep  3 17:57 test


在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  5 mysql mysql  4096 Sep  4 10:08 home
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 />


[root@localhost /]# ls -l
drwxrwxrwx    4 root     root         4096  9?nbsp; 4 21:03 home
drwxrwxrwt   10 root     root         4096  9?nbsp; 4 21:03 tmp

[root@localhost /]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.1.14-beta MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select user from user;
+--------+
| user   |
+--------+
| system |
| root   |
+--------+
2 rows in set (0.03 sec)

mysql> select user from user into outfile '/home/test.txt';
Query OK, 2 rows affected (0.02 sec)

[root@localhost home]# ls -l
-rw-rw-rw-    1 mysql    mysql          12  9?nbsp; 4 21:12 test.txt

[root@localhost home]# cat /home/test.txt
system
root


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-    1 mysql    mysql          12  9?nbsp; 4 21:12 test.txt
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:
     enforcing - SELinux security policy is enforced.
     permissive - SELinux prints warnings instead of enforcing.
     disabled - SELinux is fully disabled.
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>

abin 2015-02-04 14:31 发表评论
]]>启动和关闭MySQL服务http://www.aygfsteel.com/stevenjohn/archive/2015/01/07/422106.htmlabinabinWed, 07 Jan 2015 05:13:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/01/07/422106.htmlhttp://www.aygfsteel.com/stevenjohn/comments/422106.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/01/07/422106.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/422106.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/422106.html在windows?/strong> Q?/p>

    启动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>

abin 2015-01-07 13:13 发表评论
]]>
Mysql -- InnoDb索引http://www.aygfsteel.com/stevenjohn/archive/2015/01/06/422095.htmlabinabinTue, 06 Jan 2015 14:58:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2015/01/06/422095.htmlhttp://www.aygfsteel.com/stevenjohn/comments/422095.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2015/01/06/422095.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/422095.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/422095.htmlinnodb作ؓ事务型数据库的首选引擎,支持ACID事务Q支持行U锁定,支持外键。ƈ?/span>InnoDB默认地被包含?/span>MySQL二进制分发中Q已l成为绝大多?/span>OLTPpȝ的直选存储引擎?/span>

索引作ؓ数据库开发的一个重要方面,对于讉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






abin 2015-01-06 22:58 发表评论
]]>
innodb innodb_adaptive_hash_indexhttp://www.aygfsteel.com/stevenjohn/archive/2014/12/24/421796.htmlabinabinWed, 24 Dec 2014 10:25:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2014/12/24/421796.htmlhttp://www.aygfsteel.com/stevenjohn/comments/421796.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2014/12/24/421796.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/421796.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/421796.html    哈希QhashQ是一U非常快的查找方法,一般情况下查找的时间复杂度为OQ?Q。常用于q接QjoinQ操作,如SQL Server和Oracle中的哈希q接Qhash joinQ。但是SQL Server和Oracle{常见的数据库ƈ不支持哈希烦引(hash indexQ。MySQL的Heap存储引擎默认的烦引类型ؓ哈希Q而InnoDB存储引擎提出了另一U实现方法,自适应哈希索引Qadaptive hash indexQ?/p>

InnoDB存储引擎会监控对表上索引的查找,如果观察到徏立哈希烦引可以带来速度的提升,则徏立哈希烦引,所以称之ؓ自适应QadaptiveQ的。自适应哈希索引通过~冲池的B+树构造而来Q因此徏立的速度很快。而且不需要将整个表都建哈希烦引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引?/p>

ҎInnoDB的官Ҏ档显C,启用自适应哈希索引后,d和写入速度可以提高2倍;对于辅助索引的连接操作,性能可以提高5倍。在我看来,自适应哈希索引是非常好的优化模式,其设计思想是数据库自优化(self-tuningQ,x需DBAҎ据库q行调整?/p>

通过命oSHOW ENGINE INNODB STATUS可以看到当前自适应哈希索引的用状况,如下所C:

  1. mysql> show engine innodb status\G;  
  2. *************************** 1. row ***************************  
  3. Status:   
  4. =====================================  
  5. 090922 11:52:51 INNODB MONITOR OUTPUT 
  6. =====================================  
  7. Per second averages calculated from the last 15 seconds  
  8. ......  
  9. -------------------------------------  
  10. INSERT BUFFER AND ADAPTIVE HASH INDEX  
  11. -------------------------------------  
  12. Ibuf: size 2249, free list len 3346, seg size 5596,  
  13. 374650 inserts, 51897 merged recs, 14300 merges  
  14. Hash table size 4980499, node heap has 1246 buffer(s)  
  15. 1640.60 hash searches/s, 3709.46 non-hash searches/s  
  16. ...... 

现在可以看到自适应哈希索引的用信息了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



abin 2014-12-24 18:25 发表评论
]]>
mysql sql优化http://www.aygfsteel.com/stevenjohn/archive/2014/03/10/410811.htmlabinabinMon, 10 Mar 2014 03:27:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2014/03/10/410811.htmlhttp://www.aygfsteel.com/stevenjohn/comments/410811.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2014/03/10/410811.html#Feedback1http://www.aygfsteel.com/stevenjohn/comments/commentRss/410811.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/410811.html
1.Ҏ询进行优化,应尽量避免全表扫描,首先应考虑?where ?order by 涉及的列上徏立烦引?/div>
  2.应尽量避免在 where 子句中?=?lt;>操作W,否则引擎放弃用烦引而进行全表扫描?/div>
  3.应尽量避免在 where 子句中对字段q行 null 值判断,否则导致引擎放弃用烦引而进行全表扫描,如:
  select id from t where num is null
  可以在num上设|默认?Q确保表中num列没有null|然后q样查询Q?/div>
  select id from t where num=0
  4.应尽量避免在 where 子句中?or 来连接条Ӟ否则导致引擎放弃用烦引而进行全表扫描,如:
  select id from t where num=10 or num=20
  可以q样查询Q?/div>
  select id from t where num=10
  union all
  select id from t where num=20
  5.下面的查询也导致全表扫描:
  select id from t where name like '%abc%'
  若要提高效率Q可以考虑全文索?/div>
  6.in ?not in 也要慎用Q否则会D全表扫描Q如Q?/div>
  select id from t where num in(1,2,3)
  对于q箋的数|能用 between ׃要用 in 了:
  select id from t where num between 1 and 3
  7.如果?where 子句中用参敎ͼ也会D全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将讉K计划的选择推迟到运行时;它必d~译时进行选择。然而,如果在编译时建立讉K计划Q变量的D是未知的Q因而无法作为烦引选择的输入项。如下面语句进行全表扫描:
  select id from t where num=@num
  可以改ؓ强制查询使用索引Q?/div>
  select id from t with(index(索引?) where num=@num
  8.应尽量避免在 where 子句中对字段q行表达式操作,q将D引擎攑ּ使用索引而进行全表扫描。如Q?/div>
  select id from t where num/2=100
  应改?
  select id from t where num=100*2
  9.应尽量避免在where子句中对字段q行函数操作Q这导致引擎放弃用烦引而进行全表扫描。如Q?/div>
  select id from t where substring(name,1,3)='abc'--name以abc开头的id
  select id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id
  应改?
  select id from t where name like 'abc%'
  select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
  10.不要?where 子句中的“=”左边q行函数、算术运或其他表达式运,否则pȝ可能无法正用烦引?/div>
  11.在用烦引字D作为条件时Q如果该索引是复合烦引,那么必须使用到该索引中的W一个字D作为条件时才能保证pȝ使用该烦引,否则该烦引将不会被用,q且应尽可能的让字段序与烦引顺序相一致?/div>
  12.不要写一些没有意义的查询Q如需要生成一个空表结构:
  select col1,col2 into #t from t where 1=0
  q类代码不会q回Ml果集,但是会消耗系l资源的Q应Ҏq样Q?/div>
  create table #t(...)
 
  13.很多时候用 exists 代替 in 是一个好的选择Q?/div>
  select num from a where num in(select num from b)
  用下面的语句替换Q?/div>
  select num from a where exists(select 1 from b where num=a.num)
  14.q不是所有烦引对查询都有效,SQL是根据表中数据来q行查询优化的,当烦引列有大量数据重复时QSQL查询可能不会d用烦引,如一表中有字DsexQmale、female几乎各一半,那么即在sex上徏了烦引也Ҏ询效率v不了作用?/div>
  15.索引q不是越多越好,索引固然可以提高相应?select 的效率,但同时也降低?insert ?update 的效率,因ؓ insert ?update 时有可能会重建烦引,所以怎样建烦引需要慎重考虑Q视具体情况而定。一个表的烦引数最好不要超q?个,若太多则应考虑一些不怋用到的列上徏的烦引是否有必要?/div>
  16.应尽可能的避免更?clustered 索引数据列,因ؓ clustered 索引数据列的序是表记录的物理存储序Q一旦该列值改变将D整个表记录的序的调_会耗费相当大的资源。若应用pȝ需要频J更?clustered 索引数据列,那么需要考虑是否应将该烦引徏?clustered 索引?/div>
  17.量使用数字型字D,若只含数g息的字段量不要设计为字W型Q这会降低查询和q接的性能Qƈ会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字W,而对于数字型而言只需要比较一ơ就够了?/div>
  18.可能的使用 varchar/nvarchar 代替 char/nchar Q因为首先变长字D存储空间小Q可以节省存储空_其次对于查询来说Q在一个相对较的字段内搜索效率显然要高些?/div>
  19.M地方都不要?select * from t Q用具体的字D列表代?#8220;*”Q不要返回用不到的Q何字Dc?/div>
  20.量使用表变量来代替临时表。如果表变量包含大量数据Q请注意索引非常有限(只有主键索引)?/div>
  21.避免频繁创徏和删除时表Q以减少pȝ表资源的消耗?/div>
  22.临时表ƈ不是不可使用Q适当C用它们可以某些例程更有效,例如Q当需要重复引用大型表或常用表中的某个数据集时。但是,对于一ơ性事Ӟ最好用导?/div>
  23.在新Z时表Ӟ如果一ơ性插入数据量很大Q那么可以?select into 代替 create tableQ避免造成大量 log Q以提高速度;如果数据量不大,Z~和pȝ表的资源Q应先create tableQ然后insert?/div>
  24.如果使用C临时表,在存储过E的最后务必将所有的临时表显式删除,?truncate table Q然?drop table Q这样可以避免系l表的较长时间锁定?/div>
  25.量避免使用游标Q因为游标的效率较差Q如果游标操作的数据过1万行Q那么就应该考虑改写?/div>
  26.使用Z游标的方法或临时表方法之前,应先LZ集的解决Ҏ来解决问题,Z集的Ҏ通常更有效?/div>
  27.与时表一P游标q不是不可用。对型数据集?FAST_FORWARD 游标通常要优于其他逐行处理ҎQ尤其是在必d用几个表才能获得所需的数据时。在l果集中包括“合计”的例E通常要比使用游标执行的速度快。如果开发时间允许,Z游标的方法和Z集的Ҏ都可以尝试一下,看哪一U方法的效果更好?/div>
  28.在所有的存储q程和触发器的开始处讄 SET NOCOUNT ON Q在l束时设|?SET NOCOUNT OFF 。无需在执行存储过E和触发器的每个语句后向客户端发?DONE_IN_PROC 消息?/div>
  29.量避免向客Lq回大数据量Q若数据量过大,应该考虑相应需求是否合理?/div>
  30.量避免大事务操作,提高pȝq发能力?/div>

上面有几句写的有问题?br />
W二斚wQ?br />
select Count (*)和Select Count(1)以及Select Count(column)区别
一般情况下QSelect Count (*)和Select Count(1)两着q回l果是一L
    假如表沒有主?Primary key), 那么count(1)比count(*)快,
    如果有主键的話,那主键作为count的条件时候count(主键)最?/div>
    如果你的表只有一个字D늚话那count(*)是最快的
   count(*) ?count(1) 的结果一P都包括对NULL的统计,而count(column) 是不包括NULL的统?/div>

W三斚wQ?/div>
索引列上计算引v的烦引失效及优化措施以及注意事项

创徏索引、优化查询以便达到更好的查询优化效果。但实际上,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的方式。事实也的确如此

是MYSQL认ؓ记录?0%以上Q而不是实际MYSQLL完再军_的。都查完了,q用什么烦引啊Q!
MYSQL会先估算Q然后决定是否用烦引?/span>

 


W四斚wQ?br />
     通过explain 关键字分析效率低的SQL执行计划?/div>
     比如Q?explain select sum(moneys) from sales a, company b where a.company_id = b.company_id and a.year = 2006;
     id : 1
     select_type: SIMPLE
     table:
     type:
 
1.row:    
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ALL NULL NULL NULL NULL 1000 Using where 
 
2.row
 
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b ref ind_company_id ind_company_id 5 sakila.a.company_id 1 Using where;Using index 
 
select_type: SIMPLE, 单表Q不使用表连接或子查询;PRIMARYQ主查询Q即外层的查询;UNIONQUNION中的W二个查询或后面的查询;SUMQUERYQ子查询中的W一个SELECT?/div>
table: 输出l果集的表?/div>
type: 表示表的q接cdQ性能由好到坏Q依ơؓQ?/div>
     systemQ表中只有一行,帔R表?/div>
     constQ单表中最多有一行匹配,如pramary key 或?unique index
     eq_refQ对于前面的每一行,此表中只查询一条记录,比如多表q接中,使用primary key ?unique index
     refQ与eq_ref cMQ区别在于不是primary key 或qunique index, 而是普通烦引?/div>
     ref_or_nullQ与ref cMQ区别在于查询中包含对null的查询?/div>
     index_mergeQ烦引合q优?/div>
     unique_subqueryQin的后面是一个查询主键字D늚子查询?/div>
     index_subqueryQ与unique_subquerycMQ区别在于是查询非唯一索引字段的子查询?/div>
     rangeQ单表中的范围查询?/div>
     indexQ对于前面的每一行,都通过查询索引来得到数据?/div>
     allQ全表扫描?/div>
possible_keys: 表示查询Ӟ可能使用的烦引?/div>
key:表示实际使用的烦引?/div>
key_len:索引字段的长度?/div>
rows:扫描行的数量?/div>
Extra:执行情况的说明和描述?/div>
 
二,如何通过查询数据库各操作的比例及索引使用ơ数来判断数据库索引及用是否合理?
   1Q?     命oQ?>show status like 'Com_%';
      l果QCom_xxx 表示每个xxx语句的执行次数。如Q?/div>
    Com_select, Com_insert,Com_update,Com_delete?/div>
特别的,针对InnoDBQ?/div>
     Innodb_rows_readQselect查询q回的行?/div>
     Innodb_rows_insertedQ执行insert操作插入的行?{等?/div>
通过以上可以查看该数据库的读写比例,以便优化?/div>
     2Q?    命oQ?gt;show status like 'Handler_read%'
           查看索引使用ơ数?/div>
 
三,何时匚w到烦引?
      明确W一索引Q第二烦引的含义。回表,覆盖索引{优化方法。这里不再赘q。特别的Q组合烦引只能前~匚w。同Plike 关键字也只能前缀匚w索引Q通配W不能放在第一个字W?/div>
 
四,何时不走索引Q?/div>
       1Q如果mysql 估计索引使用比全表扫描更慢,则不使用索引。例如几乎获取全表数据的范围查询{等?/div>
       2Qor 分开的条ӞOR前的条g列有索引Q后面的没有索引Q那么涉及的索引都不会用到?/div>
       3Q条件不是组合烦引的W一部分Q即不满_~左匹配的条g?/div>
       4Qlike 条g?开始,则不走烦引?/div>
       5Qwhere 条g后如果是字符Ԍ则一定要用引hhQ不然自动{换其他类型后Q不会走索引?/div>
 
五,常用SQL优化
       1Q大扚w插入数据Q用多D句插入?/div>
             insert into test values (1,2),(2,3),(2,4)......
       2Q?优化group by, 默认情况下,mysql 会对所有group by C1,C2,C3 ... 的字D|序,与order by C1,C2,C3 cMQ所以在group by 中增加相同列的order by 性能没什么媄响?/div>
       如果用户想避免排序带来的影响Q可以显式指定不排序Q后面加上order by NULL?/div>
        3Qorder by 后面的顺序与索引序相同Q且与where 中用的条g相同Q且是烦引,则才会走真正索引?/div>
        4Qin + 子查询的 SQL 量用join q接来代ѝ?/div>
        5QOR 之间的每个条件列都必ȝ到烦引?/div>
 
六,深层一些的优化
        考虑每次查询时的IO消耗,回表ơ数Q考虑表设计时Q数据结构的不同Q比如varchar ,char 区别Q考虑表设计时每行数据的大,量保持?28K以内Q让其在一内Q避免跨,大数据行?/div>











abin 2014-03-10 11:27 发表评论
]]>MySQL 切分(Sharding)、水q_分、垂直切分以及读写分ȝ区别http://www.aygfsteel.com/stevenjohn/archive/2013/05/27/399797.htmlabinabinMon, 27 May 2013 02:14:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/05/27/399797.htmlhttp://www.aygfsteel.com/stevenjohn/comments/399797.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/05/27/399797.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/399797.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/399797.html切分QShardingQƈ不是特定数据库品所附属的功能,而是在具体技术细节之上的抽象处理。是水^扩展QScale OutQ的解决ҎQ主要目的是解决单节Ҏ据库服务器的能力限制Q以及整个应用其架构的可扩展性(ScalabilityQ?br />

切分主要有两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--



abin 2013-05-27 10:14 发表评论
]]>
INSERT INTO?ON DUPLICATE KEY UPDATEhttp://www.aygfsteel.com/stevenjohn/archive/2013/05/14/399244.htmlabinabinTue, 14 May 2013 03:14:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2013/05/14/399244.htmlhttp://www.aygfsteel.com/stevenjohn/comments/399244.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2013/05/14/399244.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/399244.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/399244.html
MySQL 当记录不存在时插入,当记录存在时更新.........具体解决办法如下Q?br />1、INSERT INTO… ON DUPLICATE KEY UPDATE使用环境Q?br />
例如Q如果列a被定义ؓUNIQUEQƈ且包含?Q则以下两个语句h相同的效果:
首先(先说UNIQUE)Q?br />
create table abin1(
id int not null unique,
username varchar(100),
password varchar(100)
)
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')




http://blog.csdn.net/kesaihao862/article/details/6718443



abin 2013-05-14 11:14 发表评论
]]>mysql 旉函数http://www.aygfsteel.com/stevenjohn/archive/2012/12/14/392991.htmlabinabinFri, 14 Dec 2012 06:32:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/12/14/392991.htmlhttp://www.aygfsteel.com/stevenjohn/comments/392991.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/12/14/392991.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/392991.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/392991.html

    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>
    例:insert into tablename (fieldname) values (now())

    now()Q以'yyyy-mm-dd hh:mm:ss'q回当前的日期时_可以直接存到datetime字段中?/span>
    curdate()Q?#8217;yyyy-mm-dd’的格式返回今天的日期Q可以直接存到date字段中?/span>

     

//获取Mysqlpȝ旉   
select now() as systime  ; 
select sysdate() as systime  ; 
select current_date as systime ;
select current_time as systime ;
select current_timestamp as systime ;
select * from abing where to_days(sysdate())=to_days(createtime);   
select * from abing where to_days(sysdate())=to_days(createtime);   
 select * from abing where str_to_date(now(),'%Y-%m-%d')=str_to_date(createtime,'%Y-%m-%d');  
自己写的例子Qؓ了以后忘C查询用:
use abin;
create table abin1(
id integer not null auto_increment,
name varchar(100),
create_time datetime ,
update_time datetime ,
constraint pk_abin1 primary key(id));
insert into abin1(name,create_time,update_time) values ('abin1',now(),now());
insert into abin1(name,create_time,update_time) values ('abin1',sysdate(),sysdate());






abin 2012-12-14 14:32 发表评论
]]>
Mysql 触发器和存储q程http://www.aygfsteel.com/stevenjohn/archive/2012/10/18/389792.htmlabinabinThu, 18 Oct 2012 02:21:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/10/18/389792.htmlhttp://www.aygfsteel.com/stevenjohn/comments/389792.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/10/18/389792.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/389792.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/389792.html1、首先徏表:
create table tababin(
id int not null auto_increment,
name varchar(100),
constraint pk primary key(id)
)

2、拷贝一张相同的表:
create table tababin1 like tababin;

3.建立主键自增触发器:
create trigger triabin before insert on tababin for each ROW
begin
set @new=new.id;
end

4、插入记录:
insert into tababin (name) values ('abin1')
insert into tababin (name) values ('abin2')
insert into tababin (name) values ('abin3')

5‘~写存储q程(带游标和LOOP循环的存储过E?Q?
CREATE  PROCEDURE pabin()
begin
declare id,status int ;
declare name varchar(100);
declare mycur cursor for select * from tababin;
declare continue handler for not found set status=1;
open mycur;
set status=0;
loopLabel:loop
fetch mycur into id,name;
if status=0 then
if id is not null then
if name is not null then
insert into tababin1 values (id,name);
end if;
end if;
end if;
if status =1 then
leave loopLabel;
end if;
end loop;
close mycur;
end

6、测试存储过E:
call pabin()


l果Qtababin1表里面新增了数据?


abin 2012-10-18 10:21 发表评论
]]>mysql 创徏定时?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2012/10/08/389202.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 08 Oct 2012 12:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2012/10/08/389202.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/389202.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/10/08/389202.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/389202.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/389202.html</trackback:ping><description><![CDATA[mysql定时器是pȝl提供了eventQ而oracle里面的定时器是系l给提供的job。废话少_下面创徏表:<br />create table mytable (<br />id int auto_increment not null,<br />name varchar(100) not null default '',<br />introduce text not null,<br />createtime timestamp not null,<br />constraint pk_mytable primary key(id)<br />)<br /><br /><br />创徏存储q程Q这里的存储q程主要提供lmysql的定时器event来调用去执行Q?br />create procedure mypro()<br />BEGIN<br />insert into mytable (name,introduce,createtime) values ('1111','inner mongolia',now());<br />end;<br />q里只是单的写了一下,只是Z说明例子?br /><br /><br />紧接着创徏mysql的定时器eventQ?br />create event if not exists eventJob <br />on schedule every 1 second <br />on completion PRESERVE<br />do call mypro();<br />q里讄为每一U执行一?br /><br /><br />x所有的准备工作已经写完了,做完q些Qmysql要想利用定时器必ȝ做准备工作,是把mysql的定时器l开启了Q?br />SET GLOBAL event_scheduler = 1;  -- 启动定时?br />SET GLOBAL event_scheduler = 0;  -- 停止定时?br /><br /><br />紧接着q要开启事Ӟ<br />ALTER EVENT eventJob ON  COMPLETION PRESERVE ENABLE;   -- 开启事?br />ALTER EVENT eventJob ON  COMPLETION PRESERVE DISABLE;  -- 关闭事g<br /><br /><br />SHOW VARIABLES LIKE '%sche%'; -- 查看定时器状?br /><br /><br />xQ你L据库里面的表mytable里面看下Q系l会每隔一U去插入一条数据,dQQ务完成了?br />select * from mytable<br /><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/389202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-10-08 20:22 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/10/08/389202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql function函数(一)http://www.aygfsteel.com/stevenjohn/archive/2012/09/17/387944.htmlabinabinMon, 17 Sep 2012 14:32:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/17/387944.htmlhttp://www.aygfsteel.com/stevenjohn/comments/387944.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/17/387944.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/387944.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/387944.htmlcreate table abing(
id int not null auto_increment,
name varchar(30),
constraint pk primary key(id)
)

2.创徏函数
create function fabin(parameter varchar(10))returns char(100)
BEGIN
declare result int;
declare restatus char(100);
select count(*) into result from abing where name like CONCAT('%',parameter,'%');
set restatus=CAST(result AS CHAR);
return(restatus);
end

3、测试函数语?br />select fabin('abing');




abin 2012-09-17 22:32 发表评论
]]>
mysql trigger(一)http://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387830.htmlabinabinSun, 16 Sep 2012 10:50:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387830.htmlhttp://www.aygfsteel.com/stevenjohn/comments/387830.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387830.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/387830.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/387830.htmlW一部分Q关于delete的触发器执行
CREATE TABLE `abin5` (
  `id` int(11) DEFAULT NULL,
  `name5` varchar(39) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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



abin 2012-09-16 18:50 发表评论
]]>
mysql 存储q程游标(一)http://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387798.htmlabinabinSat, 15 Sep 2012 19:16:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387798.htmlhttp://www.aygfsteel.com/stevenjohn/comments/387798.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387798.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/387798.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/387798.html1、徏立存储过E?br />create procedure pabin4()
BEGIN
declare status,id int;
declare az,ax varchar(100) default '';
declare mycur cursor for select * from abin5;
declare continue handler for not found set status=1;
open mycur;
 set status=0;
 loopLabel:LOOP

  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()
 



abin 2012-09-16 03:16 发表评论
]]>
mysql 存储q程循环控制指ohttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387797.htmlabinabinSat, 15 Sep 2012 18:30:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387797.htmlhttp://www.aygfsteel.com/stevenjohn/comments/387797.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387797.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/387797.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/387797.html在MySQL存储q程的语句中有三个标准的循环方式QWHILE循环QLOOP循环以及REPEAT循环。还有一U非标准的@环方式:GOTOQ不q这U@环方式最好别用,很容易引L序的混ؕQ在q里׃错具体介l了?/p>

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()


abin 2012-09-16 02:30 发表评论
]]>
mysql 存储q程(Navicat For Mysql)http://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387795.htmlabinabinSat, 15 Sep 2012 18:00:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387795.htmlhttp://www.aygfsteel.com/stevenjohn/comments/387795.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/09/16/387795.html#Feedback2http://www.aygfsteel.com/stevenjohn/comments/commentRss/387795.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/387795.html开发环境:Navicat For Mysql
W一个例子,?/span>(输出参数)q回值的存储q程Q?/span>
1、徏?br />create table abin5(
id int,
name5 VARCHAR(39)
)
2、创建存储过E?br />create procedure pabin5(out n int)
BEGIN
 select count(*) from abin5;
END
3、测试存储过E?br />call pabin5(@n)

W二个例子,带输入参数的存储q程Q?/span>
1、徏立存储过E?br />create procedure pabin6(in n int)
BEGIN
 SELECT * FROM abin5 where id=n;
END
2、测试存储过E?br />SET @n=1;
CALL pabin6(@n)




abin 2012-09-16 02:00 发表评论
]]>MYSQL?ENUM cd的详l解?/title><link>http://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371766.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Mon, 12 Mar 2012 15:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371766.html</guid><wfw:comment>http://www.aygfsteel.com/stevenjohn/comments/371766.html</wfw:comment><comments>http://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/stevenjohn/comments/commentRss/371766.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/stevenjohn/services/trackbacks/371766.html</trackback:ping><description><![CDATA[<span id="wmqeeuq" class="bold">MYSQL?ENUM cd的详l解?/span><br /><br /> <div id="wmqeeuq" class="t_msgfont"><code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> cd <p><code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 是一个字W串对象Q其值通常选自一个允许值列表中Q该列表在表创徏时的列规D明中被明地列D?/p> <p>在下列某些情况下Qg可以是空?<code><span style="color: #800080"><font face="NSimsun">""</font></span></code>) ?<code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code>Q?/p> <ul><li>如果一个无效值插入一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> (卻I一个不在允许值列表中的字W串)Q空字符串将作ؓ一个特D的错误D插入。事实上Q这个字W串有别于一?普通的"I字W串Q因个字W串有个数字索引gؓ 0。稍后有更详l描q?/li><li>如果一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 被声明ؓ <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code>Q?code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 也是该列的一个合法|q且该列的缺省gؓ <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 。如果一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 被声明ؓ <code><span style="color: #800080"><font face="NSimsun">NOT NULL</font></span></code>Q该列的~省值将是该列表所允许值的W一个成员?</li></ul> <p>每个枚D值均有一个烦引|</p> <ul><li>在列说明中列表值所允许的成员D?1 开始编受?/li><li>I字W串错误值的索引gؓ 0。这意味着Q你可以使用下面所C的 <code><span style="color: #800080"><font face="NSimsun">SELECT</font></span></code> 语句扑և被赋于无?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 值的记录行?<pre>mysql> SELECT * FROM tbl_name WHERE enum_col=0;</pre></li><li><code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 值的索引gؓ <code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code>?</li></ul> <p>例如Q指定ؓ <code><span style="color: #800080"><font face="NSimsun">ENUM("one", "two", "three")</font></span></code> 的一个列Q可以有下面所昄的Q一倹{每个值的索引g如下所C:</p> <table border="1" width="100%"> <tbody> <tr> <td><strong>?</strong></td> <td><strong>索引?</strong></td></tr> <tr> <td><code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code></td> <td><code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code></td></tr> <tr> <td><code><span style="color: #800080"><font face="NSimsun">""</font></span></code></td> <td>0</td></tr> <tr> <td><code><span style="color: #800080"><font face="NSimsun">"one"</font></span></code></td> <td>1</td></tr> <tr> <td><code><span style="color: #800080"><font face="NSimsun">"two"</font></span></code></td> <td>2</td></tr> <tr> <td><code><span style="color: #800080"><font face="NSimsun">"three"</font></span></code></td> <td>3</td></tr></tbody></table> <p>换个枚D最大可以有 65535 个成员倹{?/p> <p>?MySQL 3.23.51 开始,当表被创建时Q?code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 值尾部的I格会自动删除?/p> <p>当ؓ一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 列赋值时Q字母的大小写是无关紧要的。然而,以后从列中检索出来的值的大小写却是匹配于创徏表时所指定的允许倹{?/p> <p>如果在一个数字语境中索一?code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code>Q列值的索引值将被返回。例如,你可以像q样使用数字值检索一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 列:</p><pre>mysql> SELECT enum_col+0 FROM tbl_name;</pre> <p>如果一个数字存储到一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 中,数字被当作ؓ一个烦引|q且存储的值是该烦引值所对应的枚举成员?但是Q这?<code><span style="color: #800080"><font face="NSimsun">LOAD DATA</font></span></code> 不能工作,因ؓ它视所有的输入均ؓ字符丌Ӏ? 在一?<code><font face="NSimsun"><span style="color: #800080">ENUM</span> </font></code>字符串中存储数字是不明智的,因ؓ它可能会打ؕ思维?/p> <p><code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> g照列规格说明中的列表序q行排序?换句话说Q?code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> g照它们的索引h序?举例来说Q对?<code><span style="color: #800080"><font face="NSimsun">ENUM("a", "b")</font></span></code> <code><span style="color: #800080"><font face="NSimsun">"a"</font></span></code> 排在 <code><span style="color: #800080"><font face="NSimsun">"b"</font></span></code> 后,但是对于 <code><span style="color: #800080"><font face="NSimsun">ENUM("b", "a")</font></span></code> Q?code><span style="color: #800080"><font face="NSimsun"> "b"</font></span></code> 却排?<code><span style="color: #800080"><font face="NSimsun">"a"</font></span></code> 之前。空字符串排在非I字W串前,<code><span style="color: #800080"><font face="NSimsun">NULL</font></span></code> 值排在其它所有的枚D值前。ؓ了防止意想不到的l果Q徏议依照字母的序定义 <code><font face="NSimsun"><span style="color: #800080">ENUM</span> </font></code>列表。也可以通过使用 <code><span style="color: #800080"><font face="NSimsun">GROUP BY CONCAT(col)</font></span></code> 来确定该以字母顺序排序而不是以索引倹{?/p> <p>如果希望得到一?<code><span style="color: #800080"><font face="NSimsun">ENUM</font></span></code> 列的所有可能|可以使用 <code><span style="color: #800080"><font face="NSimsun">SHOW COLUMNS FROM table_name LIKE enum_colum</font></span></code></p></div><img src ="http://www.aygfsteel.com/stevenjohn/aggbug/371766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/stevenjohn/" target="_blank">abin</a> 2012-03-12 23:31 <a href="http://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql 字段数据cd/长度及表cd详细说明http://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371765.htmlabinabinMon, 12 Mar 2012 14:58:00 GMThttp://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371765.htmlhttp://www.aygfsteel.com/stevenjohn/comments/371765.htmlhttp://www.aygfsteel.com/stevenjohn/archive/2012/03/12/371765.html#Feedback0http://www.aygfsteel.com/stevenjohn/comments/commentRss/371765.htmlhttp://www.aygfsteel.com/stevenjohn/services/trackbacks/371765.html

一、MySQL 字段数据cd/长度

1、数值类?/strong>

列类?nbsp;             需要的存储?span class="Apple-converted-space"> 
TINYINT                1 字节 
SMALLINT             2 个字?span class="Apple-converted-space"> 
MEDIUMINT          3 个字?span class="Apple-converted-space"> 
INT                       4 个字?span class="Apple-converted-space"> 
INTEGER             4 个字?span class="Apple-converted-space"> 
BIGINT                 8 个字?span class="Apple-converted-space"> 
FLOAT(X)           4 如果 X < = 24 ?8 如果 25 < = X < = 53 
FLOAT                 4 个字?span class="Apple-converted-space"> 
DOUBLE              8 个字?span class="Apple-converted-space"> 
DOUBLE PRECISION     8 个字?span class="Apple-converted-space"> 
REAL                    8 个字?span class="Apple-converted-space"> 
DECIMAL(M,D)   M字节(D+2 , 如果M < D) 
NUMERIC(M,D)   M字节(D+2 , 如果M < D)

MySQL 的数值数据类型可以大致划分ؓ两个cdQ一个是整数Q另一个是点数或数。许多不同的子类型对q些cd中的每一个都是可用的Q每个子cd支持不同大小的数据,q且 MySQL 允许我们指定数值字D中的值是否有正负之分或者用零填补?/p>

  表列Z各种数值类型以及它们的允许范围和占用的内存I间?/p>

cd
大小
范围Q有W号Q?/strong>
范围Q无W号Q?/strong>
用?/strong>
TINYINT
1 字节
(-128Q?27)
(0Q?55)
整数?/div>
SMALLINT
2 字节
(-32 768Q?2 767)
(0Q?5 535)
大整数?/div>
MEDIUMINT
3 字节
(-8 388 608Q? 388 607)
(0Q?6 777 215)
大整数?/div>
INT或INTEGER
4 字节
(-2 147 483 648Q? 147 483 647)
(0Q? 294 967 295)
大整数?/div>
BIGINT
8 字节
(-9 233 372 036 854 775 808Q? 223 372 036 854 775 807)
(0Q?8 446 744 073 709 551 615)
极大整数?/div>
FLOAT
4 字节
(-3.402 823 466 E+38Q?.175 494 351 E-38)Q?Q?1.175 494 351 E-38Q?.402 823 466 351 E+38)
0Q?1.175 494 351 E-38Q?.402 823 466 E+38)
单精?br />点数?/div>
DOUBLE
8 字节
(1.797 693 134 862 315 7 E+308Q?.225 073 858 507 201 4 E-308)Q?Q?2.225 073 858 507 201 4 E-308Q?.797 693 134 862 315 7 E+308)
0Q?2.225 073 858 507 201 4 E-308Q?.797 693 134 862 315 7 E+308)
双精?br />点数?/div>
DECIMAL
对DECIMAL(M,D) Q如果M>DQؓM+2否则为D+2
依赖于M和D的?/div>
依赖于M和D的?/div>
数?/div>

INT cd

  ?MySQL 中支持的 5 个主要整数类型是 TINYINTQSMALLINTQMEDIUMINTQINT ?BIGINT。这些类型在很大E度上是相同的,只有它们存储的值的大小是不相同的?/p>

  MySQL 以一个可选的昄宽度指示器的形式?SQL 标准q行扩展Q这样当从数据库索一个值时Q可以把q个值加长到指定的长度。例如,指定一个字D늚cd?INT(6)Q就可以保证所包含数字于 6 个的g数据库中索出来时能够自动地用I格填充。需要注意的是,使用一个宽度指C器不会影响字段的大和它可以存储的值的范围?/p>

  万一我们需要对一个字D存储一个超可范围的数字QMySQL 会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改ؓ 0?/p>

  UNSIGNEDQ未{vQ?修饰W规定字D只保存正倹{因Z需要保存数字的正、负W号Q可以在储时节约一?#8220;?#8221;的空间。从而增大这个字D可以存储的值的范围?/p>

  ZEROFILLQ零填充Q?修饰W规?0Q不是空|可以用来真补输出的倹{用这个修饰符可以L MySQL 数据库存储负倹{?/p>

FLOAT、DOUBLE ?DECIMAL cd

  MySQL 支持的三个Q点类型是 FLOAT、DOUBLE ?DECIMAL cd。FLOAT 数值类型用于表C单_ֺ点数|?DOUBLE 数值类型用于表C双_ֺ点数倹{?/p>

  与整CPq些cd也带有附加参敎ͼ一个显C宽度指C器和一个小数点指示器。比如语?FLOAT(7,3) 规定昄的g会超q?7 位数字,数点后面带?3 位数字?/p>

  对于数点后面的位数过允许范围的|MySQL 会自动将它四舍五入ؓ最接近它的|再插入它?/p>

  DECIMAL 数据cd用于_ֺ要求非常高的计算中,q种cd允许指定数值的_ֺ和计数方法作为选择参数。精度在q里指ؓq个g存的有效数字的M敎ͼ而计数方法表C小数点后数字的位数。比如语?DECIMAL(7,3) 规定了存储的g会超q?7 位数字,q且数点后不超q?3 位?/p>

  忽略 DECIMAL 数据cd的精度和计数Ҏ修饰W将会 MySQL 数据库把所有标识ؓq个数据cd的字D늲度设|ؓ 10Q计方法设|ؓ 0?/p>

  UNSIGNED(未签|? ?ZEROFILLQ零填充Q?修饰W也可以?FLOAT、DOUBLE ?DECIMAL 数据cd使用。ƈ且效果与 INT 数据cd相同?/p>

2、日期和旉cd

列类?nbsp;                 需要的存储?/strong> 
DATE                        3 个字?span class="Apple-converted-space"> 
DATETIME                8 个字?span class="Apple-converted-space"> 
TIMESTAMP             4 个字?span class="Apple-converted-space"> 
TIME                         3 个字?span class="Apple-converted-space"> 
YEAR                        1 字节

      在处理日期和旉cd的值时QMySQL 带有 5 个不同的数据cd可供选择。它们可以被分成单的日期、时间类型,和؜合日期、时间类型。根据要求的_ֺQ子cd在每个分cd中都可以使用Qƈ?MySQL 带有内置功能可以把多样化的输入格式变Z个标准格?/p>

cd
大小
(字节)
范围
格式
用?/strong>
DATE
3
1000-01-01/9999-12-31
YYYY-MM-DD
日期?/div>
TIME
3
'-838:59:59'/'838:59:59'
HH:MM:SS
旉值或持箋旉
YEAR
1
1901/2155
YYYY
q䆾?/div>
DATETIME
8
1000-01-01 00:00:00/9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
混合日期和时间?/div>
TIMESTAMP
8
1970-01-01 00:00:00/2037 q某?/div>
YYYYMMDD HHMMSS
混合日期和时间|旉?/div>

DATE、TIME ?TEAR cd

  MySQL ?DATE ?TEAR cd存储单的日期|使用 TIME cd存储旉倹{这些类型可以描qCؓ字符串或不带分隔W的整数序列。如果描qCؓ字符ԌDATE cd的值应该用连字号作ؓ分隔W分开Q?TIME cd的值应该用冒号作为分隔符分开?/p>

  需要注意的是,没有冒号分隔W的 TIME cd|会?MySQL 理解为持l的旉Q而不是时间戳?/p>

  MySQL q对日期的年份中的两个数字的|或是 SQL 语句中ؓ TEAR cd输入的两个数字进行最大限度的通译。因为所?TEAR cd的值必ȝ 4 个数字存储。MySQL 试图?2 个数字的q䆾转换?4 个数字的倹{把?00-69 范围内的D{换到 2000-2069 范围内。把 70-99 范围内的D{换到 1970-1979 之内。如?MySQL 自动转换后的值ƈ不符合我们的需要,误?4 个数字表C的q䆾?/p>

DATETIME ?TIMESTAMP cd

   除了日期和时间数据类型,MySQL q支?DATEYIME ?TIMESTAMP q两U؜合类型。它们可以把日期和时间作为单个的D行存储。这两种cd通常用于自动存储包含当前日期和时间的旉戻Iq可在需要执行大量数据库事务和需要徏立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用?/p>

  如果我们?TIMESTAMP cd的字D|有明赋|或是被赋与了 null 倹{MySQL 会自动用系l当前的日期和时间来填充它?/p>

3、字W串cd

列类?nbsp;                           需要的存储?/strong> 
CHAR(M)                         M字节Q? <= M <= 255 
VARCHAR(M)                  L+1 字节, 在此L <= M? <= M <= 255 
TINYBLOB, TINYTEXT     L+1 字节, 在此L< 2 ^ 8 
BLOB, TEXT                   L+2 字节, 在此L< 2 ^ 16 
MEDIUMBLOB, MEDIUMTEXT            L+3 字节, 在此L< 2 ^ 24 
LONGBLOB, LONGTEXT                   L+4 字节, 在此L< 2 ^ 32 
ENUM('value1','value2',...)               1 ?2 个字? 取决于枚丑ր的数目(最大?5535Q?span class="Apple-converted-space"> 
SET('value1','value2',...)                  1Q?Q?Q??个字? 取决于集合成员的数量(最?4个成员)

      MySQL 提供?8 个基本的字符串类型,可以存储的范围从单的一个字W到巨大的文本块或二q制字符串数据?/p>

cd
大小
用?/strong>
CHAR
0-255字节
定长字符?/div>
VARCHAR
0-255字节
变长字符?/div>
TINYBLOB
0-255字节
不超q?255 个字W的二进制字W串
TINYTEXT
0-255字节
短文本字W串
BLOB
0-65 535字节
二进制Ş式的长文本数?/div>
TEXT
0-65 535字节
长文本数?/div>
MEDIUMBLOB
0-16 777 215字节
二进制Ş式的中等长度文本数据
MEDIUMTEXT
0-16 777 215字节
中等长度文本数据
LOGNGBLOB
0-4 294 967 295字节
二进制Ş式的极大文本数据
LONGTEXT
0-4 294 967 295字节
极大文本数据

CHAR ?VARCHAR cd

  CHAR cd用于定长字符Ԍq且必须在圆括号内用一个大修饰符来定义。这个大修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度的值将会用I格作填补?/p>

  CHAR cd可以使用 BINARY 修饰W。当用于比较q算Ӟq个修饰W CHAR 以二q制方式参于q算Q而不是以传统的区分大写的方式?/p>

  CHAR cd的一个变体是 VARCHAR cd。它是一U可变长度的字符串类型,q且也必d有一个范围在 0-255 之间的指C器。CHAR ?VARCHGAR 不同之处在于 MuSQL 数据库处理这个指C器的方式:CHAR 把这个大视为值的大小Q不长度不的情况下qI格补。?VARCHAR cd把它视ؓ最大值ƈ且只使用存储字符串实际需要的长度Q增加一个额外字节来存储字符串本w的长度Q来存储倹{所以短于指C器长度?VARCHAR cd不会被空格填补,但长于指C器的g然会被截短?/p>

  因ؓ VARCHAR cd可以Ҏ实际内容动态改变存储值的长度Q所以在不能定字段需要多字W时使用 VARCHAR cd可以大大地节U磁盘空间、提高存储效率?/p>

  VARCHAR cd在?BINARY 修饰W时?CHAR cd完全相同?/p>

TEXT ?BLOB cd

  对于字段长度要求过 255 个的情况下,MySQL 提供?TEXT ?BLOB 两种cd。根据存储数据的大小Q它们都有不同的子类型。这些大型的数据用于存储文本块或囑փ、声x件等二进制数据类型?/p>

  TEXT ?BLOB cd在分cd比较上存在区别。BLOB cd区分大小写,?TEXT 不区分大写。大修饰符不用于各U?BLOB ?TEXT 子类型。比指定cd支持的最大范围大的值将被自动截短?/p>

3、复合类?/strong>

  MySQL q支持两U复合数据类?ENUM ?SETQ它们扩展了 SQL 规范。虽然这些类型在技术上是字W串cdQ但是可以被视ؓ不同的数据类型。一?ENUM cd只允总一个集合中取得一个|?SET cd允许从一个集合中取得L多个倹{?/p>

ENUM cd

  ENUM cd因ؓ只允许在集合中取得一个|有点cM于单选项。在处理怺排拆的数据时Ҏ让h理解Q比如hcȝ性别。ENUM cd字段可以从集合中取得一个值或使用 null |除此之外的输入将会 MySQL 在这个字D中插入一个空字符丌Ӏ另外如果插入值的大小写与集合中值的大小写不匚wQMySQL 会自动用插入值的大小写{换成与集合中大小写一致的倹{?/p>

   ENUM cd在系l内部可以存储ؓ数字Qƈ且从 1 开始用数字做烦引。一?ENUM cd最多可以包?65536 个元素,其中一个元素被 MySQL 保留Q用来存储错误信息,q个错误值用索引 0 或者一个空字符串表C?/p>

  MySQL 认ؓ ENUM cd集合中出现的值是合法输入Q除此之外其它Q何输入都失败。这说明通过搜烦包含I字W串或对应数字烦引ؓ 0 的行可以很Ҏ地找到错误记录的位置?/p>

SET cd

  SET cd?ENUM cd怼但不相同。SET cd可以从预定义的集合中取得L数量的倹{ƈ且与 ENUM cd相同的是M试图?SET cd字段中插入非预定义的值都会 MySQL 插入一个空字符丌Ӏ如果插入一个即有合法的元素又有非法的元素的记录QMySQL 会保留合法的元素,除去非法的元素?/p>

  一?SET cd最多可以包?64 元素。在 SET 元素中D存储Z个分ȝ“?#8221;序列Q这?#8220;?#8221;表示与它相对应的元素?#8220;?#8221;是创建有序元素集合的一U简单而有效的方式。ƈ且它q去除了重复的元素,所?SET cd中不可能包含两个相同的元素?/p>

  希望?SET cd字段中找出非法的记录只需查找包含I字W串或二q制gؓ 0 的行?/p>

二、MySQL 数据表类型说?/strong>

1. MyISAM ?/strong> MyISAM 存储格式自版?.23 以来?MySQL 中的~省cdQ它有下列特点:
■ 如果操作pȝ自n允许更大的文Ӟ那么文g?ISAM 存储Ҏ的大?br />■ 数据以低字节优先的机器独立格式存储。这表示可将表从一U机器拷贝到另一U机器,即它们的体pȝ构不同也可以拯?br />■ 数值烦引值占的存储空间较,因ؓ它们是按高字节优先存储的。烦引值在低位字节中变化很快,因此高位字节更容易比较?br />■ AUTO_INCREMENT 处理?ISAM 的表更好?br />■ 减少了几个烦引限制。例如,可对?NULL 值的列进行烦引,q可以对 BLOB ?TEXT cd的列q行索引?br />■ Z改善表的完整性检查,每个表都h一个标志,?myisamchk 对表q行q检查后Q设|该标志。可利用 myisamchk - fast 跌对自前次查以来尚未被修改q表的检查,q样使此理d更快。表中还有一个指C是否正常关闭的标志。如果服务器关闭不正常,或机器崩溃,此标志可用来出服务器v动时需要检查的表?/p>

2. ISAM ?/strong> ISAM 存储格式?MySQL3.23 所用的最旧的格式Q但当前仍然可用。通常Q相对于 ISAM 表来_宁可使用 MyISAM 表,因ؓ它们的限制较。对 ISAM 表的支持随着此存储格式被 MyISAM 表格式所支持很有可能会逐渐消失?/p>

3. HEAP ?/strong> HEAP 存储格式建立利用定长行的内存中的表,q表运行得非常快。在服务器停止时Q它们将会消失。在q种意义上,q些表是临时的。但是,与用 CREATE TEMPORARY TABLE 所创徏的时表相比QHEAP 表是其他客户机可见的。HEAP 表有几个限制Q这些限制对 MyISAM ?ISAM 表没有,如下所C:
■ 索引仅用?#8220;=”?#8220;< = >”比较?br />■ 索引列中不能?NULL 倹{?br />■ 不能使用 BLOB ?TEXT 列?br />■ 不能使用 AUTO_INCREMENT 列。 



abin 2012-03-12 22:58 发表评论
]]>
վ֩ģ壺 | | ʩ| | ó| | | | | | ̨| ƽ| Ϋ| | ˮ| ֱ| | ˮ| | ӽ| Դ| ʯ| ī| Ϻ| | | | | ̨| | | ά| | | | | | | | ٤ʦ| |