[原创]MySQL存储引擎InnoDB表的限制_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2996 | 回复: 0   主题: [原创]MySQL存储引擎InnoDB表的限制        下一篇 
tngou
注册用户
等级:中校
经验:2433
发帖:192
精华:15
注册:2014-4-28
状态:离线
发送短消息息给tngou 加好友    发送短消息息给tngou 发消息
发表于: IP:您无权察看 2014-6-24 14:01:47 | [全部帖] [楼主帖] 楼主   主页



  • 在 < 3.23.50 版本的 InnoDB 
    中,不可以使用 ALTER TABLE 或 CREATE INDEX 
    来修改一个已经有了外键约束或参考了外键约束的表。使用 DROP TABLE 和 CREATE TABLE 
    来代替它。 
  • 不可以将 MySQL 系统表(如 
    'user' 或 'host' )转换成 InnoDB 类型。系统表必须总是为 MyISAM 
    类型的。 
  • InnoDB 表不支持全文搜索(fulltext 
    search)。 
  • MySQL 以自动提交模式(autocommit 
    mode)执行复制(replication)。因此slave中的 consistent reads 可能看起来你部分处理过的事务,所以在 slave 
    中这种读取(read)并不是真正的 consistent 。这个限制在 3.23.52 不再存在。 
  • InnoDB 在内部不保存一个表记录总数,这是由于 
    multiversioning 的原因使它实现有点复杂。为了响应一个查询 SELECT COUNT(*) FROM 
    T ,InnoDB 不得不扫描表的一个索引,如果表没有完全在缓冲池中这将花费一些时间。 
    为了得到更快的计数你不得不使用自己创建一个计数表,让你的应用程序在插入与删除时自己更新它。 
    消除因锁等待引起的瓶颈的一个方法就是创建整体的计数器集。应用程序可以随机地每次选择一个。 为了得到计数,仅仅只要对计数器求和:SELECT 
    SUM(counter_column) FROM your_counter_table。 
  • 表中有 auto-increment 
    列的必须为它定义一个键,这个键必须仅仅包含这个 auto-increment 列。InnoDB 不支持在一个 CREATE TABLE 
    语句中使用 AUTO_INCREMENT=... 。这个子句是为了给一个 auto-increment 
    列设置第一个值(默认的第一个值为 1)。工作区(Workaround):向自增列中插入一个指定的值做为第一个值。从此,InnoDB 
    将从这值开始增加。 
  • SHOW TABLE 
    STATUS 不能给出 InnoDB 表的精密统计数据,除了由表保留的物理大小之外。记录行数只能通过一个优化的 SQL 
    来获得大致的估计。 
  • 在 MySQL 
    中复制(replication)中,load table from master 仍然不能在 InnoDB 表中工作。 
    在主(master)服务器中开设一个工作区(workaround )用于将表转换成 MyISAM 型,然后再进行 load,之后再在 master 中将表改回 
    InnoDB 类型。 
  • 如果以一个列的前面部分建立索引: 

    CREATE TABLE T (A CHAR(20), B INT, INDEX T_IND (A(5))) TYPE = InnoDB;

    InnoDB 
    将内在的在整个列上建立一个索引,而不是仅以设定的首部分。 

  • InnoDB 表不支持 INSERT 
    DELAYED 。 
  • MySQL 的 LOCK 
    TABLES 操作无法知道一个 SQL 语句已完成对 InnoDB 
    的行锁定:这就意味着即使已有其它用户的事务在同一张表上设置了行锁,你仍然会锁定该表。 
    所以你在这张表上的操作与其它用户的锁定冲突则不得不等待。同样死锁也是可能的。无论如何, 这能事务完整性(transaction 
    integrity)并不危险,因为 InnoDB 
    设置的行级锁定通常会照顾完整性(integrity)的。同样,一个表级锁定可以防止其它事务在表上获得更多的行级锁定(锁定模式不一致)。 
  • 在 BLOB 或 
    TEXT 字段上无法设置索引。 
  • 一张表不可以有超过 1000 个字段。 

  • DELETE FROM

    TABLE 除了删除所有记录行之外不再重建表,一个接一个地删除,这并不那么快。在将来的 MySQL 版本中可以使用 
    TRUNCATE ,这是相当快的。 

  • 在 <= 3.23.43 的 InnoDB 
    中,在对 InnoDB 表调用 DROP DATABASE 之前,必须调用 DROP TABLE 
    来移除(drop) 个体的 InnoDB 表。这个限制在 >= 3.23.44 的版本中不再存在。 
  • InnoDB 默认的数据库页面大小为 16 
    kB。通过重新编译源代码可以设置为 8 kB 到 64 kB。你必须在 univ.i

        中更新 
    UNIV_PAGE_SIZE 和 UNIV_PAGE_SIZE_SHIFT 。在版本 <= 
    3.23.39a 的 InnoDB中,最大记录行长度为比数据库页面长度的一半稍小点。从源释放版本 3.23.39b (但是在 MySQL -Max 3.23.40 
    二进制释放版本中仍然没有)开始, BLOB 和 TEXT 字段允许 < 4 GB,整个行长度同样 < 4 GB。InnoDB 
    不在分开的页面中存储尺寸 <= 128 bytes 的字段。在 InnoDB 
    通过将长字段存储在分开的页面上修改记录后,剩余的记录行长度必须小于数据库页面的一半。最大键长为 500 bytes。 

  • 日志文件的总尺寸必须 < 4 GB。 
  • 最大表空间尺寸为数据库页面的 4 
    十亿(billion)倍。这同样也是一个表的最大尺寸。最小表空间为 10 MB。 


该贴由hui.chen转至本版2014-11-5 16:11:48



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论