加入一个表有大量数据(用于线下测试的数据),需要再一个字段(非主键)上建立索引,是在创建表的时候创建索引比较好还是等数据写入完之后加入数据呢?why?
希望详细点说明原理。
希望详细点说明原理。
解决方案 »
- 不知道mysql密码
- mysql报错Can't reopen table: 'n'
- 请问一下如何将postgesql数据转到mysql数据库中??????
- 这一步是设置谁的字符集
- mysql 5.0的服务为什么一启动就自动停止?
- mysql_close()函数为何会出错?
- 【求助】mysql #2002 无法登录 MySQL 服务器
- 如何替换某一个值的内容的最后一个指定的字符
- 我遇到一个问题,就是我现在有一个数据是一天的,现在我想用mysql语言统计一天内相同IP的个数?我该怎么实现,烦请各位大牛指导,最好有完整的代码。
- Mysql 5.7 创建的用户只能24小时有效
- MySql语句效率问题
- 我的数据库性别类型是枚举enum,然后string‘女’插入时可以,更新时就是Data truncated for column 'sex' at row 1
CREATE TABLE `aae` (
`BH` varchar(6) CHARACTER SET gbk DEFAULT NULL,
`XM` varchar(8) CHARACTER SET gbk DEFAULT NULL,
`DW` varchar(6) CHARACTER SET gbk DEFAULT NULL,
`NY` double DEFAULT NULL,
`RYLB` varchar(2) CHARACTER SET gbk DEFAULT NULL,
`DWLB` varchar(2) CHARACTER SET gbk DEFAULT NULL,
`GDGZ` double DEFAULT NULL,
`HGZ` double DEFAULT NULL,
`BT` smallint(6) DEFAULT NULL,
`LT` double DEFAULT NULL,
`TGGZ` double DEFAULT NULL,
`TSJT` smallint(6) DEFAULT NULL,
`QTBT` double DEFAULT NULL,
`BF` double DEFAULT NULL,
`FZ` double DEFAULT NULL,
`SF` double DEFAULT NULL,
`DF` double DEFAULT NULL,
`QF` double DEFAULT NULL,
`HTBX` double DEFAULT NULL,
`ZNF` double DEFAULT NULL,
`LSDK` double DEFAULT NULL,
`GZSH` double DEFAULT NULL,
`JYFJ` double DEFAULT NULL,
`YXDS` smallint(6) DEFAULT NULL,
`SDS` double DEFAULT NULL,
`GJJ` double DEFAULT NULL,
`SYBX` double DEFAULT NULL,
`YLBX` double DEFAULT NULL,
`SFGZ` double DEFAULT NULL,
`id` int(11) NOT NULL DEFAULT '0',
UNIQUE KEY `BH` (`id`),
KEY `BH1` (`BH`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8准备89000条记录,用LOAD DATA INIFILE导入,用时00:03:891
CREATE TABLE `aaf` (
`BH` varchar(6) CHARACTER SET gbk DEFAULT NULL,
`XM` varchar(8) CHARACTER SET gbk DEFAULT NULL,
`DW` varchar(6) CHARACTER SET gbk DEFAULT NULL,
`NY` double DEFAULT NULL,
`RYLB` varchar(2) CHARACTER SET gbk DEFAULT NULL,
`DWLB` varchar(2) CHARACTER SET gbk DEFAULT NULL,
`GDGZ` double DEFAULT NULL,
`HGZ` double DEFAULT NULL,
`BT` smallint(6) DEFAULT NULL,
`LT` double DEFAULT NULL,
`TGGZ` double DEFAULT NULL,
`TSJT` smallint(6) DEFAULT NULL,
`QTBT` double DEFAULT NULL,
`BF` double DEFAULT NULL,
`FZ` double DEFAULT NULL,
`SF` double DEFAULT NULL,
`DF` double DEFAULT NULL,
`QF` double DEFAULT NULL,
`HTBX` double DEFAULT NULL,
`ZNF` double DEFAULT NULL,
`LSDK` double DEFAULT NULL,
`GZSH` double DEFAULT NULL,
`JYFJ` double DEFAULT NULL,
`YXDS` smallint(6) DEFAULT NULL,
`SDS` double DEFAULT NULL,
`GJJ` double DEFAULT NULL,
`SYBX` double DEFAULT NULL,
`YLBX` double DEFAULT NULL,
`SFGZ` double DEFAULT NULL,
`id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8用上述记录导入,导入时间 00:02:766
CREATE UNIQUE INDEX bh ON aaf(id) ; 用时 00:03:594
CREATE INDEX bh1 ON aaf(bh) ;用时 00:03:328
`BH` VARCHAR(6) CHARACTER SET gbk DEFAULT NULL,
`XM` VARCHAR(8) CHARACTER SET gbk DEFAULT NULL,
`DW` VARCHAR(6) CHARACTER SET gbk DEFAULT NULL,
`NY` DOUBLE DEFAULT NULL,
`RYLB` VARCHAR(2) CHARACTER SET gbk DEFAULT NULL,
`DWLB` VARCHAR(2) CHARACTER SET gbk DEFAULT NULL,
`GDGZ` DOUBLE DEFAULT NULL,
`HGZ` DOUBLE DEFAULT NULL,
`BT` SMALLINT(6) DEFAULT NULL,
`LT` DOUBLE DEFAULT NULL,
`TGGZ` DOUBLE DEFAULT NULL,
`TSJT` SMALLINT(6) DEFAULT NULL,
`QTBT` DOUBLE DEFAULT NULL,
`BF` DOUBLE DEFAULT NULL,
`FZ` DOUBLE DEFAULT NULL,
`SF` DOUBLE DEFAULT NULL,
`DF` DOUBLE DEFAULT NULL,
`QF` DOUBLE DEFAULT NULL,
`HTBX` DOUBLE DEFAULT NULL,
`ZNF` DOUBLE DEFAULT NULL,
`LSDK` DOUBLE DEFAULT NULL,
`GZSH` DOUBLE DEFAULT NULL,
`JYFJ` DOUBLE DEFAULT NULL,
`YXDS` SMALLINT(6) DEFAULT NULL,
`SDS` DOUBLE DEFAULT NULL,
`GJJ` DOUBLE DEFAULT NULL,
`SYBX` DOUBLE DEFAULT NULL,
`YLBX` DOUBLE DEFAULT NULL,
`SFGZ` DOUBLE DEFAULT NULL,
`id` INT(11) NOT NULL DEFAULT '0'
) ENGINE=MYISAM DEFAULT CHARSET=utf8LOAD DATA INFILE 'r://temp//123.txt' INTO TABLE aae1
00:00:00:453
CREATE UNIQUE INDEX bh ON aae1(id) ;
00:00:00:438
CREATE INDEX bh1 ON aae1(bh)
00:00:00:734CREATE TABLE `aae2` (
`BH` VARCHAR(6) CHARACTER SET gbk DEFAULT NULL,
`XM` VARCHAR(8) CHARACTER SET gbk DEFAULT NULL,
`DW` VARCHAR(6) CHARACTER SET gbk DEFAULT NULL,
`NY` DOUBLE DEFAULT NULL,
`RYLB` VARCHAR(2) CHARACTER SET gbk DEFAULT NULL,
`DWLB` VARCHAR(2) CHARACTER SET gbk DEFAULT NULL,
`GDGZ` DOUBLE DEFAULT NULL,
`HGZ` DOUBLE DEFAULT NULL,
`BT` SMALLINT(6) DEFAULT NULL,
`LT` DOUBLE DEFAULT NULL,
`TGGZ` DOUBLE DEFAULT NULL,
`TSJT` SMALLINT(6) DEFAULT NULL,
`QTBT` DOUBLE DEFAULT NULL,
`BF` DOUBLE DEFAULT NULL,
`FZ` DOUBLE DEFAULT NULL,
`SF` DOUBLE DEFAULT NULL,
`DF` DOUBLE DEFAULT NULL,
`QF` DOUBLE DEFAULT NULL,
`HTBX` DOUBLE DEFAULT NULL,
`ZNF` DOUBLE DEFAULT NULL,
`LSDK` DOUBLE DEFAULT NULL,
`GZSH` DOUBLE DEFAULT NULL,
`JYFJ` DOUBLE DEFAULT NULL,
`YXDS` SMALLINT(6) DEFAULT NULL,
`SDS` DOUBLE DEFAULT NULL,
`GJJ` DOUBLE DEFAULT NULL,
`SYBX` DOUBLE DEFAULT NULL,
`YLBX` DOUBLE DEFAULT NULL,
`SFGZ` DOUBLE DEFAULT NULL,
`id` INT(11) NOT NULL DEFAULT '0',
UNIQUE KEY `BH` (`id`),
KEY `BH1` (`BH`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8LOAD DATA INFILE 'r://temp//123.txt' INTO TABLE aae2
00:00:00:922对比一下结果
两种情况下创建索引所用的数据是一样的,排除其它因素影响,如下是一个常理:插入的时候如果有索引则更加耗时,没有索引更快。那么插入时就已经多花费时间了,不是吗?另外还有一些印象,没去查资料证实,各位有空查证了也麻烦告诉我:
创建索引如果拥有全部的数据会比只有部分数据来得更快:
1. 因为程序在创建索引时需要分配空间(内存、磁盘),如果知道全部的数据就可以一次性分配足够的空间,否则程序(mysqld)是增量地申请空间的,每次申请和分配以及程序移动数据都要耗费时间。
2. 另外可能还有一些算法上的优化,好像是叫B树还是什么的最后再一次性创建索引还有一个好处就是因为磁盘空间是一次性申请到的,其物理上也会尽可能在一起,使用起来减少磁盘寻道的时间,所以也会提高查询时的性能。