iLeichun

当前位置:首页MySQL

如何合适的使用MySQL存储引擎

分类:MySQL  来源:网络  时间:2010-10-23 14:43:36

MySQL有多种存储引擎:

  MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

  MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:

  ◆ MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。

  ◆ MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。

  注释:MEMORY存储引擎正式地被确定为HEAP引擎。

  ◆ InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。

  ◆ EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。

  ◆ NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。

  ◆ ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。

  ◆ CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。

  ◆ BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。

  ◆ FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。

  当你创建一个新表的时候,你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表:

  CREATE TABLE t (i INT) ENGINE = INNODB;

  CREATE TABLE t (i INT) TYPE = MEMORY;

  虽然TYPE仍然在MySQL 5.1中被支持,现在ENGINE是首选的术语。

  如何选择最适合你的存储引擎呢?

下述存储引擎是最常用的:

  ◆ MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。

  ◆ InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。

  ◆ BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。

  ◆ Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

  ◆ Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

  ◆ Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

  ◆ Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

  ◆ Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。

  ◆ Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。

  请记住,对于整个服务器或方案,你并不一定要使用相同的存储引擎,你可以为方案中的每个表使用不同的存储引擎,这点很重要。

 


 mysql> show engines;
  +------------+---------+----------------------------------------------------------------+
  | Engine   | Support | Comment                            |
  +------------+---------+----------------------------------------------------------------+
  | MyISAM   | DEFAULT | Default engine as of MySQL 3.23 with great performance     |
  | MEMORY   | YES   | Hash based, stored in memory, useful for temporary tables   |
  | InnoDB   | YES   | Supports transactions, row-level locking, and foreign keys   |
  | BerkeleyDB | NO   | Supports transactions and page-level locking          |
  | BLACKHOLE | NO   | /dev/null storage engine (anything you write to it disappears) |
  | EXAMPLE  | NO   | Example storage engine                     |
  | ARCHIVE  | NO   | Archive storage engine                     |
  | CSV    | NO   | CSV storage engine                       |
  | ndbcluster | NO   | Clustered, fault-tolerant, memory-based tables         |
  | FEDERATED | NO   | Federated MySQL storage engine                 |
  | MRG_MYISAM | YES   | Collection of identical MyISAM tables             |
  | ISAM    | NO   | Obsolete storage engine                    |
  +------------+---------+----------------------------------------------------------------+

MySQL Community Server 5.1.51

分类:MySQL  来源:网络  时间:2010-10-23 14:42:10

MySQL(发音:[ˌmaɪ ɛs kjuː ˈɛl],但也经常读作My- SEQuel)是一个开放源码的关系数据库管理系统,开发者为瑞典MySQL AB公司,现为Sun公司的一部分。2009年Oracle宣布收购Sun公司,因此MySQL可能成为Oracle旗下产品。MySQL由于性能高、成 本低、可靠性好,已经成为最流行的开源数据库,被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站 和应用,比如维基百科、Google和Facebook。非常流行的开源软件组合LAMP中的M就是指 MySQL。

下载:http://dev.mysql.com/downloads/
更新:http://dev.mysql.com/doc/refman/5.1/en/news-5-1-51.html

mySQL随机取数据的执行效率

分类:MySQL  来源:网络  时间:2010-10-23 14:38:46

 昨晚我在编写“路过的”的应用随机取笑话的时候发现一个问题,我的目标是从笑话表(大约几万条数据量)中随机抽取一条笑话并显示,起初我的SQL如下:

  Sql代码

  select * from xiaohua limit 随机数,1

  其中随机数是由java程序产生,当随机数比较小时,发现执行速度非常快,但当随机数如超过1w时,执行速度超慢,看来这条路是行不通了,于是我又利用mysql的rand()函数,看看执行效率,发现效率也不好,最后我通过google了一下,发现碰到这个问题的人还是很多的,最终的SQL如下(速度超过),可到http://l.faqee.com/的查看笑话看执行速度:

  Sql代码

以下是代码片段:
 SELECT t1.id as id,title,content,class_name,class_id,hits FROM xiaohua AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM xiaohua )-(SELECT MIN(id) FROM xiaohua ))+(SELECT MIN(id) FROM xiaohua )) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;

MySQL中多表删除方法

分类:MySQL  来源:网络  时间:2010-10-23 14:37:22

  如果您是才接触MySQL数据库的新人,那么MySQL中多表删除是您一定需要掌握的,下面就将为详细介绍MySQL中多表删除的方法,供您参考,希望对你学习掌握MySQL中多表删除能有所帮助。

  1、从MySQL数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉

  DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id

  2、从MySQL数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉

  DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 或

  DELETE FROM t1,USING t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL

  3、从两个表中找出相同记录的数据并把两个表中的数据都删除掉

  DELETE t1,t2 from t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id=25

  注意此处的delete t1,t2 from 中的t1,t2不能是别名

  如:delete t1,t2 from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MySQL 版本不小于5.0在5.0中是可以的)

  上述语句改写成

  delete table_name,table2_name from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MySQL 版本小于5.0在5.0中是可以的)

  以上就是MySQL中多表删除的方法介绍。

MySQL 5.5部分新特性首度公开

分类:MySQL  来源:网络  时间:2010-10-23 14:25:42

MySQL 5.5部分新特性首度公开

在10月16日举办的Thinkinlamp&上海爱可生MySQL用户大会上,Oracle GBU MySQL技术专家杜修文披露,MySQL 5.5在将InnoDB作为默认存储引擎后,增强了“MySQL+InnoDB”组合的性能,除过去已经证实的新特性外,增加了:

  1. InnoDB buffer pool实现多个“分区” 以降低内部锁数量(Multiple Buffer Pool Instances)从而提升MySQL性能。

  2. 过去限制InnoDB并发的原因在于InnoDB Rollback Segments只能接受1024个并发,新的Multiple Rollback Segments并发限制提升为128*1024个,InnoDB的并发数量获得巨大提升。

  3. 增加PERFORMANCE_SCHEMA状态,使用户可以查看MySQL性能参数,从而更简便的调整和提升MySQL性能。

  以上MySQL 5.5新特性,将同时在MySQL社区版与企业版中体现。

  4. 在MySQL企业版5.5当中,Innodb hotbackup 作为Innodb上的热备工具,将在增强后成为MySQL Enterprise Backup,从而结束了MySQL没有高性能实时热备功能的历史。

MySQL 5.0.91最终版发布 高危漏洞被修复

分类:MySQL  来源:网络  时间:2010-8-28 1:20:35

  此次更新将是MySQL 5.0.91的最后一次更新,建议大家立即更新MySQL 5.0.91。这也意味着MySQL 5.0系列不再开发。

  详细更新如下:

  安全更新:解决了服务器验证COM_FIELD_LIST失败的问题。这问题有可能被利用来绕过所有表的特权检查。

  在MySQL 5.0及以上的版本上,这样的BUG将使所有用户能通过SELECT权限验证来获得所有其他数据库中任何表中的字段定义。以及潜在的其他MySQL服务器文件系统的访问权限。

  解决BUG列表:(Bug#53237, CVE-2010-1850),(Bug#50974, CVE-2010-1849),(Bug#52177),(Bug#51357),(Bug#51342),(Bug#50642),(Bug#50335),(Bug#49897),(Bug#49552),(Bug#49487),(Bug#49210),(Bug#48739),(Bug#48483),(Bug#48295)

PHP中Mysql Limit语句操作优化比较

分类:MySQL  来源:网络  时间:2010-8-15 23:51:01

select * from table LIMIT 5,10; #返回第6-15行数据
select * from table LIMIT 5; #返回前5行
select * from table LIMIT 0,5; #返回前5行

性能优化:
基于MySQL5.0中limit的高性能,我对数据分页也重新有了新的认识.

1.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90001
) As tmp
) limit 100;

2.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90000,1
) As tmp
) limit 100;

同样是取90000条后100条记录,第1句快还是第2句快?
第1句是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录
第2句择是仅仅取90000条记录后1条,然后取ID值作起始标识定位下100条记录
第1句执行结果.100 rows in set (0.23) sec
第2句执行结果.100 rows in set (0.19) sec

很明显第2句胜出.看来limit好像并不完全像我之前想象的那样做全表扫描返回limit offset+length条记录,这样看来limit比起MS-SQL的Top性能还是要提高不少的.

MySQL时间筛选SQL的语句

分类:MySQL  来源:网络  时间:2010-8-15 23:50:16

Select all rows inserted within the last 24 hours(最近24小时新插入数据):
mysql>SELECT * FROM entries WHERE entry_date > UNIX_TIMESTAMP(NOW()) - 86400;

Select all rows inserted before 12:00am of the current day(当天12点前插入的数据):
mysql>SELECT * FROM entries WHERE date(entry_date) = date(NOW());

Determine the weekday of the most recent entry for a specific user(检查一个特定——指定用户最近一天登陆时间——以星期算,也就是某用户最近一次登陆是星期几):
mysql>SELECT DAYNAME(MAX(entry_date)) AS day FROM entries WHERE user_id = 22;

MySQL内部函数说明:
UNIX_TIMESTAMP():返回unix时间戳,stamp单词为邮戳、邮票的意思。
dayname(date):传回日期的名称,例如Monday、Sunday
MAX():最大的数

SELECT DAYNAME(MAX(`login_time`)) AS day FROM `Member`(对于更新登陆时间来说,此句就是返回最近一次登陆是星期几)

mysql整型

分类:MySQL  来源:网络  时间:2010-8-15 23:49:12

MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。

声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它 指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是 INT整型所允许的最大值。
 

MySQL浮点型

分类:MySQL  来源:网络  时间:2010-8-15 23:47:39

mysql浮点型数据列类型,首先,浮点型数据类型我们用得比较少,主要是我们一直不考虑数据库的大小与紧密性,所以才这么忽略的。

MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。
浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。

MySQL 4.0.2版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。

浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的,默认,当 MySQL版本大于3.23.6时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在MySQL3.23.6后 可选,默认D值为0,M值为10。