索引; 频繁更新的字段不适合做索引 优势:提高查询效率,本质上就是降低IO的使用率 降低cpu使用率 假如说排序如果不适用索引,它得一个一个查询出来
再排序,如果使用了索引,它是一个B树 已经是排好序的了(B树,小的放左,大的放右)
B+树种查询任意的数据次数:n次(B+树的高度) 因为B+树种数据全部存在叶节点上面
如果索引字段为null,则会使用一个字节来标识一下这个字段可以为null
例如:name字段not null name1字段可以为null 两个字段都添加成为了索引字段
-------------------------------------------------------------------------------------------+
| test_k1 | CREATE TABLE `test_k1` (
`name` char(20) CHARACTER SET utf8 NOT NULL DEFAULT '',
`name1` char(20) CHARACTER SET utf8 DEFAULT NULL,
KEY `index_name` (`name`),
KEY `index_name1` (`name1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
explain select * from test_k1 where name=''; //这样执行的时候ken_len=60
explain select * from test_k1 where name1=''; //这样执行的时候ken_len=61
原因就是因为索引字段为null时候,会花费一个字节用于标识
删除索引操作:
drop index index_name on test_k1;
drop index index_name1 on test_k1;
然后在这个表中增加一个复合索引
alter table test_k1 add index name_name1_index(name,name1);
explain select * from test_k1 where name=''; //这样执行的时候ken_len=60
explain select * from test_k1 where name1=''; //这样执行的时候ken_len=121
因为你用到的是name1索引,因为是复合索引,当你用name1的时候,你肯定得用到name这个索引 这时候是120,由于name1索引可以为空所以占用一个字节的长度
增加一个字段用可变字符varchar()来表示,刚才那两个name,name1字段使用的char()字段 也把这个字段添加成索引字段
alter table test_k1 add column name2 varchar(20);
alter table test_k1 add index index_name2(name2);
explain select * from test_k1 where name2=''; //这样执行的时候ken_len=63
这个63是因为name2字段是可变字段varchar用2个字节来表示varchar 还有就是可以为null也占用一个字节 所以总共是63个字节
uft8:1个字符3个字节
gbk: 1个字符2个字节
latin:1个字符1个字节