`
tree_161219
  • 浏览: 87764 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转个东西-- MySQL MyIsam 存储引擎索引长度限制测试记录

阅读更多

MySQL MyIsam 存储引擎索引长度限制测试记录

作者:sky | 分类: 大话技术 | 标签: Innodb, MyIsam, MySQL, 大话技术 | 日期:2008-08-17

MySQL MyIsam 存储引擎在创建索引的时候,索引键长度是有一个较为严格的长度限制的,所有索引键最大长度总和不能超过1000,而且不是实际数据长度的总和,而是索引键字段定义长度的总和。下面做个简单的测试,记录一下。

root@sky:~# mysql -u sky -p -h127.0.0.1
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.0.51a-log MySQL Community Server (GPL)

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

sky@127.0.0.1 : (none) 05:23:08> use test;
Database changed
sky@127.0.0.1 : test 05:23:11>
sky@127.0.0.1 : test 05:23:12>

先创建一个MyIsam表,字符集选择latin1,三个字段均设置为varchar 255,:
sky@127.0.0.1 : test 05:23:12> create table test_ind
-> (a varchar(255),
->  b varchar(255),
->  c varchar(255)
-> ) engine=myisam charset=latin1;
Query OK, 0 rows affected (0.01 sec)

创建效果:
sky@127.0.0.1 : test 05:23:32> show create table test_ind\G
*************************** 1. row ***************************
Table: test_ind
Create Table: CREATE TABLE `test_ind` (
`a` varchar(255) default NULL,
`b` varchar(255) default NULL,
`c` varchar(255) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

三个字段联合索引(长度应该在1000以内)

sky@127.0.0.1 : test 05:23:41> create index test_a_b_c_ind on test_ind(a,b,c);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

我们看到,创建成功了。

下面我们做一次字符集转换,将字符集转换成utf8

sky@127.0.0.1 : test 05:25:54> alter table test_ind convert to charset utf8;
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
sky@127.0.0.1 : test 05:26:24>
sky@127.0.0.1 : test 05:28:03> show create table test_ind\G
*************************** 1. row ***************************
Table: test_ind
Create Table: CREATE TABLE `test_ind` (
`a` varchar(255) default NULL,
`b` varchar(255) default NULL,
`c` varchar(255) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

结果报错了,查看表实际情况也确实没有成功,仍然是latin1的字符集。

我们现drop掉索引,再转换字符集。

sky@127.0.0.1 : test 05:28:10> drop index test_a_b_c_ind on test_ind;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

sky@127.0.0.1 : test 05:28:15> alter table test_ind convert to charset utf8;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
sky@127.0.0.1 : test 05:28:20> show create table test_ind\G
*************************** 1. row ***************************
Table: test_ind
Create Table: CREATE TABLE `test_ind` (
`a` varchar(255) default NULL,
`b` varchar(255) default NULL,
`c` varchar(255) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
转换很顺利,成功了。

现在再创建索引看看效果怎样:

sky@127.0.0.1 : test 05:28:36> create index test_a_b_c_ind on test_ind(a,b,c);
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

失败,减少索引键字段
sky@127.0.0.1 : test 05:28:54> create index test_a_b_c_ind on test_ind(a,b);
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

还是失败,继续减少
sky@127.0.0.1 : test 05:29:00> create index test_a_b_c_ind on test_ind(a);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

ok,总算成功了。

最后再看看其他存储引擎有没有这个限制呢?就看当前用的最广泛的存储引擎之一Innodb吧:

sky@127.0.0.1 : test 05:29:03> drop index test_a_b_c_ind on test_ind;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

sky@127.0.0.1 : test 05:29:54>
sky@127.0.0.1 : test 05:29:58>
sky@127.0.0.1 : test 05:30:11> alter table test_ind engine=innodb;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
sky@127.0.0.1 : test 05:31:15> show create table test_ind\G
*************************** 1. row ***************************
Table: test_ind
Create Table: CREATE TABLE `test_ind` (
`a` varchar(255) default NULL,
`b` varchar(255) default NULL,
`c` varchar(255) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

sky@127.0.0.1 : test 05:31:23> create index test_a_b_c_ind on test_ind(a,b,c);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

很顺利,创建成功,Innodb是没有这个限制的。
分享到:
评论

相关推荐

    mysql存储引擎介绍

    除了 MyISAM 和 InnoDB 之外,MySQL 还提供了其他几个存储引擎,如 MEMORY、MERGE 等。 MEMORY 存储引擎是一种基于内存的存储引擎,数据存储在内存中,访问速度非常快,但是数据不是持久性的,服务器重启后数据将会...

    MySQL MyISAM默认存储引擎实现原理

    本文将深入探讨MyISAM存储引擎的实现原理及其特性。 MyISAM是MySQL的默认存储引擎之一,它在磁盘上存储表数据的方式独具特色。每个MyISAM表由三个文件组成: 1. `.frm` 文件:存储表的结构信息,包括字段定义、...

    MySQL索引长度限制原理解析

    MySQL索引长度限制是数据库设计中的一个重要因素,它直接影响到数据检索的速度和存储空间的效率。在MySQL中,不同的存储引擎对索引长度有不同的限制,这主要是由它们的内部实现和设计目标决定的。 首先,InnoDB引擎...

    MySQL2:四种MySQL存储引擎.doc

    2. MyISAM存储引擎: - MyISAM是早期MySQL广泛使用的存储引擎,适用于读取密集型应用,插入和查询速度较快,但不支持事务处理。 - 它支持大文件,最大文件长度取决于操作系统和文件系统的支持。 - MyISAM在删除和...

    mysql-存储引擎和数据库对象实验五.docx

    MERGE 存储引擎是一种基于 MyISAM 引擎的合并存储引擎,它可以突破 MyISAM 引擎的大小限制。MERGE 存储引擎本身没有数据,若删除也只是删除了表结构,对数据没有影响。可以对合并的 MyISAM 表进行增删查改操作。 三...

    MyISAM,InnoDB存储引擎1

    MyISAM存储引擎是MySQL早期的默认引擎,以高速存储和检索以及全文搜索能力著称。在MyISAM中,每个表由三个物理文件组成:.frm存储表定义,.MYD存储数据,.MYI存储索引。MyISAM支持三种文件格式:静态固定长度、动态...

    mysql存储引擎比较

    #### 二、MyISAM存储引擎 **2.1 MyISAM简介** MyISAM是一种非事务性的存储引擎,广泛应用于Web应用、数据仓库等场景。它是MySQL早期版本中最常用的存储引擎之一,尤其适用于读取密集型的应用环境。 **2.2 特性与...

    一线大厂Mysql面试题详解.pdf

    InnoDB与MyISAM是MySQL中两种常见的存储引擎。它们之间的主要区别包括: * InnoDB支持事务,而MyISAM不支持事务。 * InnoDB支持行级锁,而MyISAM支持表级锁。 * InnoDB支持MVCC,而MyISAM不支持。 * InnoDB支持外键...

    MySql的存储引擎.doc

    5. Archive引擎仅支持SELECT和INSERT操作,无索引,适合日志记录和聚合分析,因为它能高效地存储大量只读数据。 要查看MySQL数据库支持的存储引擎,可以使用`SHOW ENGINES;`命令。默认存储引擎可以通过修改配置文件...

    第6章MySQL存储引擎与数据库.docx

    在MySQL中,存储引擎主要负责数据的物理存储方式、事务处理、索引管理以及并发控制。 1. MyISAM:这是MySQL早期的默认存储引擎,以其快速的插入和查询速度而著名,但它不支持事务处理。这意味着在MyISAM中,一旦...

    索引类型FULLTEXT,HASH,BTREE,RTREE,索引优化1

    例如,MyISAM 存储引擎使用 B+Tree,叶子节点存储数据记录的地址,形成非聚簇索引,主索引与辅助索引的区别仅在于主键不能有重复值。相反,InnoDB 使用聚簇索引,其中叶子节点直接包含数据记录,一个表只有一个聚簇...

    MySQL面试题-BAT的MySQL面试题

    面试中,MySQL相关的知识考察往往涵盖数据库设计、SQL语句、存储引擎、优化策略以及安全性等多个方面。以下是一些重要的MySQL知识点: 1. **数据库范式**: - 第一范式(1NF)要求数据库表的每个字段都是不可分割...

    MySQL索引背后的数据结构及算法原理

    MyISAM引擎的索引和数据分开存储,这意味着索引是独立于数据的。 - **InnoDB索引实现**:InnoDB是MySQL中最常用的存储引擎之一,它使用B+Tree作为索引结构。InnoDB引擎支持事务处理,并且它的索引和数据是混合存储的...

    072401MySQL索引2

    1. **BTREE索引**:是最常见的索引类型,通常用于InnoDB和MyISAM存储引擎。BTREE是一种平衡树结构,确保数据访问的效率。InnoDB的BTREE是聚簇索引,数据和索引是存储在一起的,提高了检索效率。每张表只有一个聚簇...

    mysql实验报告+-+索引的创建与管理

    3. 将WORKINFO表的存储引擎更改为MyISAM,以支持降序索引: ```sql ALTER TABLE workinfo ENGINE=MYISAM; ``` MyISAM引擎支持对整列进行降序索引,而InnoDB不支持。 4. 在extra字段上创建名为index_ext的全文索引:...

    mysql问题,常见的mysql面试问题

    - 在UTF-8编码下,每个字符最多占用3个字节,因此`VARCHAR`的最大长度取决于存储引擎的支持。对于大多数存储引擎来说,`VARCHAR`的最大长度为65535个字符。 #### 3. PRIMARY KEY与UNIQUE约束的区别 - **PRIMARY ...

Global site tag (gtag.js) - Google Analytics