mysql索引太大怎么办 mysql索引坏处

mysql索引名太长怎么办1. 数据库版本:阿里云RDS MySQL5.1
mysql select @@version;
+-------------------------------+
| @@version |
+-------------------------------+
| 5.1.61-Alibaba-rds-201404-log |
+-------------------------------+
1 row in set (0.00 sec)
2. 测试的表结构信息
mysql show create table tb2\G
*************************** 1. row ***************************
Table: tb2
Create Table: CREATE TABLE `tb2` (
`a` varchar(255) DEFAULT NULL,
`b` varchar(255) DEFAULT NULL,
`c` varchar(255) DEFAULT NULL,
`d` varchar(1000) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
3. 测试加索引
(1)添加单列索引mysql索引太大怎么办,能够添加成功(报出warning)mysql索引太大怎么办,但实际添加的是前缀索引 。
mysql alter table tb2 add index idx1 (d);
Query OK, 0 rows affected, 2 warnings (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql show warnings;
+---------+------+----------------------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------------------+
| Warning | 1071 | Specified key was too long; max key length is 1000 bytes |
| Warning | 1071 | Specified key was too long; max key length is 1000 bytes |
+---------+------+----------------------------------------------------------+
2 rows in set (0.00 sec)
表结构信息:
mysql show create table tb2\G
*************************** 1. row ***************************
Table: tb2
Create Table: CREATE TABLE `tb2` (
`a` varchar(255) DEFAULT NULL,
`b` varchar(255) DEFAULT NULL,
`c` varchar(255) DEFAULT NULL,
`d` varchar(1000) DEFAULT NULL,
KEY `idx1` (`d`(333))
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
(2)添加组合索引mysql索引太大怎么办,会执行失败 。
mysql alter table tb2 add index idx1 (a,b);
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
4. 分析
myisam存储引擎在创建索引的时候mysql索引太大怎么办,索引键长度是有一个较为严格的长度限制的mysql索引太大怎么办,所有索引键最大长度总和不能超过1000 , 而且不是实际数据长度的总和 , 而是索引键字段定义长度的总和 。
主要字符集的计算方式:
latin1 = 1 byte = 1 character
uft8 = 3 byte = 1 character
gbk = 2 byte = 1 character
MySQL索引过多会产生哪些问题因为太多的索引与不充分、不正确的索引对性能都毫无益处:
在表上建立的每个索引都会增加存储开销 , 索引对于插入、删除、更新操作也会增加处理上的开销 。
另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;
相反 , 还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大
Mysql大表加索引 select (*) from tb_name where create_timexxx;
最终得知是因为这个表数据行数已经超过 一千万了,然后create_time字段又没有索引。
那解决办法肯定是加索引喽 。
但是这个表是一直在线上运行,很重要和业务部分 。如果给千万级的大表在线加索引  , 肯定会卡死 。
然后就搜罗了一大筐解决方案,比如 在线无锁加索引使用
ALTER TABLE tbl_name ADD PRIMARY(column), ALGORITHM=INPLACE, LOCK=NONE;
后来才发现,这个特性是 Mysql 5.6 以后才支持,然而我们的mysql用的是5.5版本
最后在 《高性能Mysql》一书中看到,可在通过 “影子拷贝”来解决,
就是 先创建一张和源表无关的新表,然后通过重命名和删表操作交换两张表;

推荐阅读