发布新日志

  • Mysql事务

    2013-03-04 16:43:02

    • MyISAM之类的存储引擎使用了数据表级的锁定机制来保证不同的发客户不能修改同一个数据表,但这种做法在更新量比较大的系统上会导致并发性能的下降
    • InnoDB存储引擎采用了另一种策略,它使用了数据行级的锁定机制为客户对数据表的访问提供了更细致的控制
    • InnoDB存储引擎提供了多种不同隔离级别以允许或预防在多个事务同时运行时可能发生的各种各样的问题
      • 脏读:指某个事务所作出的修改在它尚未被提交时就可以被其他事务看到
      • 不可重复读取:指同一事务使用同一条select语句每次读取到的结果不一样
      • 幻影数据行:指某个事务突然看到了一个它以前没有见过的数据行
      • 4种隔离级别
        • READ UNCOMMITTED 允许某个事务看到其他事务未提交的数据行改动
        • READ COMMITTED只允许某个事务看到其他事务已经提交的数据行改动
        • REPEATABLE READ如果某个事务两次执行同一个select语句,其结果可重复的
        • SERIALIZABLE:某个事务正在查看的数据行不允许其他事务修改,直到该事务完成为止
    • 隔离级别脏读不可重复读取幻影数据行
      READ UNCOMMITTED
      READ COMMITTED
      REPEATABLE READ(InnoDB默认隔离级别)
      SERIALIZABLE

  • 内联结和外联结的区别

    2013-03-04 14:57:09


      • 内联结只显示在两个数据表里都能找到匹配的数据行
      • 外联结除了显示同样的匹配结果,还可以把其中一个数据表在另一个数据表里没有匹配的数据行也显示出来
        • 外联结包括左联结和右联结
        • 在Left Join里,
          • 来自左数据表的每一个数据行在结果集里都有一个对应的数据行,不管它在右数据表里有没有匹配
          • 在右数据表里没有匹配的结果数据行有这样一个特征,来自右数据表的所有数据列都是NULL值
        • 在使用LEFT JOIN时需要注意这样一个问题,如果右数据表里的数据列没有被全部定义成NOT NULL,结果集里的数据行就可能不能反映真实情况。比如说,如果右数据表里的某个数据列运行取值为null并被收录在结果集里,用这个数据列里的NULL值来判断“在右数据表里没有匹配”就可能出现问题

  • Mysql索引

    2013-03-04 11:50:14

    • 为数据表编制索引
      • Mysql提供多种灵活的索引创建办法
        • 可以为单个数据列编制索引,也可以为多个数据列构造复合索引
        • 索引可以只包含对一无二的值,也可以包含重复的值
        • 可以为同一个数据表创建多个索引并分别利用他们来优化基于不同数据列的查询
        • 可以只为数据列的一个前缀创建索引,如果数据列在前缀长度范围内具有足够的独一无二性,查询性能会得到改善(为数据列前缀而不是整个数据列编制索引可以让索引本身更小并加快访问速度)
        • 并非所有的存储引擎都能提供全部的索引功能
      • Mysql支持的索引类型
        • 唯一索引:不允许索引项本身出现重复的值
        • 普通(非唯一)索引:运行索引值出现重复值
        • FullText索引:这种索引支持MyISAM数据表
        • SPATIAL索引:这种索引只支持MyISAM数据表和空间数据类型
        • HASH索引:这是MEMORY数据表的默认索引类型
      • PRIMARY KEY和UNIQUE索引的区别
        • 每个数据表只能由一个PRIMARY KEY
        • PRIMARY KEY不可以包含NULL值,而UNIQUE索引可以(Mysql无法判断两个NULL值是否代表同样的东西,索引里的多个NULL值将被认为代表多个不同的东西)
        • 除PRIMARY KEY以外,其他索引类型都可以用CREATE INDEX语句来添加
      • 通过3中方法添加索引
        • CREATE TABLE时(index_name是可选的)
        • CREATE INDEX时
        • ALTER TABLE时(index_name是可选的)
      • 当你从数据表删除数据列时,索引也会隐式地受到影响
        • 如果你删除的数据列是某个索引的组成部分,mysql将从索引里删除那个数据列
        • 如果你把构成某个索引的数据列全部丢弃了,mysql将删除整个索引
  • Mysql临时数据表

    2013-03-01 17:00:00

    • 一个TEMPPORARY数据表只对该数据表的客户是可见的
    • 一个TEMPPORARY数据表的名字运行于一个现有的永久性数据表相同,只是创建这个TEMPPORARY数据表的客户在此表存在期间将不再能看到那个永久性的数据表
    • 无法创建两个同名的TEMPPORARY数据表
    • 如果客户程序会在服务器的连接意外断开时自动重建连接,上次创建的TEMPPORARY数据表在你重新连接上服务器时将不复存在,这时如果执行DROP TABLE语句将会导致那个永久性的数据表被删除,如果要避免这种情况发生,就应该使用DROP TEMPPORARY TABLE语句代替
    • 因为TEMPPORARY数据表只对创建它们的连接时可见的,所以如果使用了某种连接池机制,它们的用处就没有多大了,因为连接池机制不能保证你发出的每一条语句使用的都是同一条连接
    • 如果使用了连接池或永久性连接,你与MYsql服务器之间的连接在应用程序结束时就不一定会被关闭。那些机制可能会让连接保持打开状态供其他用户使用,而这意味着你创建的TEMPPORARY数据表不一定会在你的应用程序结束时自动消失
  • 影响InnoDB可移植性的因素

    2013-02-28 17:54:38

      • 两台机器之间被移植的数据表不包含任何浮点数据列或者两台机器使用的浮点数存储格式是一样的
      • 数据库和数据表的名字应该由小写字母构成。InnoDB存储引擎在其数据字典里把这些名字统一保存为小写字母格式,但.frm文件里的名字却与你在CREATE TABLE 语句里使用的大小写情况完全一样,如果当初在创建数据库或数据表时使用的是大写字母,而现在你想把它们移植到一个队文件名区分大小写的平台上去,就有可能因为字母的大小写情况不匹配而遇到问题

  • Mysql存储引擎

    2013-02-28 17:38:47

    • MyISAM存储引擎
      • 提供了键压缩功能。它使用某种压缩算法来保存连续的,相似的字符串索引值
      • 与其他存储引擎相比MyISAM为AUTO_INCREMENT数据列提供了更多的功能
      • 每个MyISAM数据表都有一个标志,服务器或myisamchk程序在检查MyISAM数据表时会对这个标志进行设置
      • 支持全文检索,但这需要通过FULLTEXT索引来实现
      • MyISAM支持空间数据类型和SPATIAL索引
    • MERGE存储引擎
      • MERGE数据表提供了一种把多个MyISAM数据表合并为一个逻辑单元的手段,查询一个MERGE数据表相当于查询其所有的成员数据表,这个种好处之一是可以绕开文件系统对各个MyISAM数据表的最大长度限制
      • 用来构成MERGE数据表的所有数据表必须有同样的结构。这意味着必须为各成员数据表里的数据列定义同样的名字、同样的类型和同样的顺序,索引也必须以同样的办法按同样的顺序定义
      • 可以把经过压缩和未经过压缩的数据表混杂在一起而构成一个MERGE数据表
    • MEMORY存储引擎
      • 把数据表保存在内存里,这些数据表有着长度固定不变的数据行,这两个特点使得数据表的检索速度非常快
      • 在默认的情况下,MEMORY数据表使用散列索引,利用这种索引进行“相等比较”的速度非常快,单进行“范围比较”的速度就慢多了
      • 存储在MEMORY数据表里的数据行使用的是长度固定不变的格式,以此加快处理速度,这意味着你不能使用BLOB和TEXT这样长度不可变的数据类型,但是可以使用VARCHAR类型
      • 如果确实需要使用MEMORY鼠标和“>”“<”或BETWEEN操作符进行某种比较以判断某个值是否落在某个范围内,可以使用BTREE索引来加快速度
    • InnoDB存储引擎
      • 支持提交和回滚操作,确保数据在事务处理过程中万无一失。还可以通过创建保存点(savepoint)的办法来实现部分回滚
      • 在系统崩溃后可以自动恢复
      • 外键和引用完整性支持,包括递归式删除和更新
      • 数据行级别的锁定和多版本共存,这使得InnoDB数据表在需要同时进行检索和更新操作的复杂查询里表现出非常好的并发性能
      • 在默认的情况下,InnoDB存储引擎会把数据表几种存储在一个共享的表空间里,而不是为不同的数据表创建不同的文件。InnoDB表空间可以由多个文件构成,还可以包括多个原始分区。实际上InnoDB表空间就像一个虚拟的文件系统,它存储和管理所有InnoDB数据表内容。这样一来,数据表的长度就可以超过文件系统对各个文件的最大长度限制。你也可以把InnoDB存储引擎配置成为为每个数据表分别创建一个表空间的样子。
    • Falcon存储引擎
      • 支持提交和回滚操作,确保数据在事务处理中万无一失。还可以通过创建保存点来实现部分回滚
      • 在系统崩溃后可以自动恢复
      • 灵活的锁定级别和多版本共存,使得Falcon数据表在需要同时进行检索和更新操作的复杂查询里表现出非常的并发性能
      • 在春初时对数据进行压缩,在检索时对数据进行解压缩以节省空间
      • 日常管理和维护方面的开销低
    • FEDREATED存储引擎
      • 用途是访问其他Mysql服务器管理下的数据表。
      • 当你创建一个FEDREATED数据表时,需要指定一台运行着其他服务器程序的主机,并提供那个服务器的合法账户的用户名和口令。当你打算访问数据表时,本地服务器将使用这个账户连接那台远程服务器
    • NDB存储引擎
      • 是Mysql的集群存储引擎。在这个引擎工作时,Mysql服务器的作用是帮助其他进程访问NDB数据表
      • 各集群结点上的进程通过彼此通信来管理内存中的数据表。
      • 为了减少冗余,数据表在集群进程中被复制
      • 内存春初提供了高性能,集群机制提供了高度可用性,即使个别结点发生故障,系统也不会崩溃
    • ARCHIVE存储引擎
      • 对数据进行归档,最适合用来大批量地保存那些“写了就不改了”的数据行,因为只支持INSERT和SELECT
      • 为了节省空间,在存储时会对数据进行压缩
      • DELETE或UPDATE根本不能用
      • 每个数据表最多只能由一个带索引的AUTO_INCREMENT数据列
    • BLACKHOLE存储引擎
      • 写操作其实是删除数据,而读操作时返回空白记录
    • CSV存储引擎
      • 会在数据库子目录里为每个数据表创建一个csv文件
      • 不支持索引
    • EXAMPLE存储引擎
      • 用来演示如何编写存储引擎的最小化样板。它存在的价值是让开发人员通过查看其源代码去学习怎样才能正确地把存储引擎加载到服务器里

  • Mysql字符集

    2013-02-28 11:57:45

    • Mysql字符集
      • Mysql服务器允许同时使用多种字符集
      • 一种给定的字符集可以有一种或多种多种排序方式。你可以为应用程序挑选一种最使用的派讯方式
      • Unicode支持utf8和ucs2字符集提供,从Mysql6.0.4版开始有更多的字符集可供选用
      • 你可以在服务器、数据库、数据表、数据列和字符串常数等级别设定字符集
        • 服务器有一个默认的字符集
        • CREATE DATABASE语句可以用来设定数据库级字符集,ALTER DATABASE语句可以改变设定的数据库级字符集
        • CREATE TABLE和ALTER TABLE语句有专门用来设定数据表级和数据列级的子句
        • 用于字符串常数的字符集既可以通过上下文设定,也可以明确设定
      • 既有用来转换数据值的字符集和函数和操作符,也有用来判断数据值的字符集的函数和操作符。COLLATE操作符可以用来改变某个字符串的排序方式,而COLLATE()函数将返回某给定字符串的排序方式
      • SHOW语句和INFORMATION_SCHEMA数据表提供了关于可用字符集和排序方式的信息
      • 当你改变某个带索引的字符类型的数据列时,Mysql服务器将自动对索引进行重新排序
      • 服务器的默认字符集和排序方式是在当初编译时内建的,但我们可用在启动服务器时使用--cahracter-set-server和--collation-server选项,或是在服务器启动后设置character-set-server和collation-server系统变量来覆盖它们
      • 如果只选定了字符集,它的默认排序方式就将称为服务器的默认排序方式,如果想选定一种排序方式,必须让它与字符集保持兼容
      • 通过SHOW CHARACTER SET;SHOW COLLATION;查看系统支持的字符集和排序方式
      • 通过SHOW VARIABLES LIKE 'character\_set\_%'  show variables like 'collation%',显示Mysql服务器的当前字符集和排序方式的设置情况
  • Mysql数据库和数据表命名规则

    2013-02-28 11:56:31

    • Windows文件名不区分字母的大小写,所以运行在windows主机上的msyql服务器也就不区分数据库和数据表名字的字母大小写,运行在unix主机上的mysql服务器往往要区分数据库和数据表名字的大小写,因为unix文件系统是区分字母大小写的。当你在一台区分文件名字母大小写的机器上创建数据库和数据表时,避免字母大小写问题演变成棘手的问题的办法之一,是选定一种字母大小写方案,一直遵照该方案去创建数据表和数据库,这样一来,等你日后想把某个数据库迁移到不同的服务器上时,名字的大小写问题就不存在了。建议是统一使用小写字母,这在你使用innodb数据表时也有益处,因为innodb引擎在其内部是把数据库和数据表的名字保存为小写字母的
      • 如果想统一使用小写字母来创建数据库和数据表名字--就算没在create语句里特意设定也能通过设置lower_case_table_name系统变量来配置服务器
  • Mysql服务器的sql模式

    2013-02-28 11:55:07

    • Mysql服务器有一个名为sql_mode的系统变量可以让你调控其sql模式,各个客户可以通过改变这个模式来影响它们对Mysql服务器的连接,这意味着任何一个客户都可以在不影响其他客户的前提下改变mysql服务器对自己的反应
      • STRICT_ALL_TABLES和STRICT_TRANS_TABLES将启用严格模式。Mysql服务器在接受“坏”数据值方面讲更加严格
      • TRADITIONAL是另一种复合模式,类似于严格模式,单启用了其他几种引入额外限制条件的模式以进行更加严格的数据检查
      • ANSI_QUOTES告诉Mysql服务器把双引号识别为一个标示符引用字符(启用了ANSI_QUOTES还有一个额外的效果--字符串值必须用单引号写出,如果使用双引号,mysql服务器将把该值解释为标示符而不是字符串)
      • PIPES_AS_CONCAT将导致“||”字符串被视为一个标准的SQL字符串合并操作,而不是“OR”操作的一个同义词
      • ANSI是一种复合模式,它将同时启用ANSI_QUOTES、PIPES_AS_CONCAT和另外几种模式值,其结果是让Mysql服务器的行为比它默认运行状态更接近于标准SQL
      • IGNORE_SPACE内建函数名将视为保留字
                   实现方法
      • 可以在mysqld命令上或是某个选项文件里使用sql_mode选项(--sql-mode="TRADITIONAL,PIPES_AS_CONCAT")
      • 可以在运行时改变sql模式,可以使用条set语句来设置sql_mode系统变量(SET sql_mode="TRADITIONAL,PIPES_AS_CONCAT")
      • 如果需要对sql模式做全局性设置,需要加上global关键字(SET GLOBAL sql_mode="TRADITIONAL,PIPES_AS_CONCAT")设置全局变量需要具备super管理权限,新设置值将成为此后连接的所有客户的模式sql模式
      • 如果想知道会话级或全局级sql模式的当前值(select @@session.sql_mode,@@global.sql_mode;)
  • 以二进制程序包形式安装mysql

    2013-02-26 17:52:03


    1.下载mysql二级制程序包
    2.通过md5和pgp校验
    3.安装部署
    shell> groupadd mysql
    shell> useradd -r -g mysql mysql
    shell> cd /usr/local
    shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
    shell> ln -s full-path-to-mysql-VERSION-OS mysql
    shell> cd mysql
    shell> chown -R mysql .
    shell> chgrp -R mysql .
    shell> scripts/mysql_install_db --user=mysql --datadir=/mysql/data
    shell> chown -R root .
    shell> chown -R mysql data
    shell> cp support-files/my-default.cnf /etc/my.cnf
    shell> cp support-files/mysql.server /etc/init.d/mysqld
    shell> chkconfig --add mysqld
    4.执行测试脚本
    /usr/local/mysql/mysql-test/mysql-test-run.pl

  • 将mysql设置为自动启动

    2013-02-26 15:45:52

    1.将启动文件copy到启动目录中
    cp support-files/mysql.server /etc/init.d/mysqld
    2.添加chkconfig配置
     chkconfig --add mysqld
    3.重启
  • mysql无法登录报mysql.sock问题解决方法

    2013-02-26 15:42:19

    错误信息:
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    解决方法:
    修改/etc/my.conf:添加以下内容

    [mysqld] 
    datadir=/usr/local/mysql/data 

    socket=/var/lib/mysql/mysql.sock 

    [client] 

    socket=/var/lib/mysql/mysql.sock 

    (注意:红色标记部分文件路径必须相同)
  • 下载文件的GnuPG Signature校验

    2013-02-26 13:01:33

    1.Linux平台 Signature校验
    •  http://pgp.mit.edu/. 输入 mysql-build@oss.oracle.com后下载PGP public key到扩展名为asc的本地文件中
    • 在Mysql官方网站中下载GnuPG Signature并另存为mysql-5.6.10-linux-glibc2.5-x86_64.tar.gz.asc(asc前面的内容要和你要校验的安装包一致)
    • 看到Good signature就ok了
    2.Windows平台 Signature校验
       参考mysql官方文档,很详细了就不写了http://dev.mysql.com/doc/refman/5.6/en/checking-gpg-signature-windows.html
  • 备份和还原msyql 数据库和数据表

    2010-04-20 14:45:48

    随着测试工作的逐步深入,经常需要备份数据表和数据表
    在mysql数据库中有Test1数据库并且在这个数据库中有A B两个数据表
    1. 备份数据库
    mysqldump -h127.0.0.1 Test1  > Test1.sql
      a.mysqldump是备份数据库的命令
      b.-h127.0.0.1表示要操作的数据库是本机
      c.Test1表示要备份的数据库是Test1
      d. > Test1.sql表示备份出来的文件名

    2. 备份数据表
    mysqldump -h127.0.0.1 Test1 A > Test1.a.sql
      a.mysqldump是备份数据库的命令
      b.-h127.0.0.1表示要操作的数据库是本机
      c.Test1表示要备份的数据表所在的数据库是Test1
      d.A 表示要备份的数据表
      e. > Test1.a.sql表示备份出来的文件名
    备份完了就需要还原
    1.还原数据库
    mysql -h127.0.0.1 Test1 < Test1.sql

    2.还原数据表
    mysql -h127.0.0.1 Test1 < Test1.a.sql

    还有一个非常有用的方法,把mysql查询出来的结果导出到一个文件中,接下来我们就可以用这个文件做数据分析了
    select * from A into outfile 'xxx.txt'
Open Toolbar