mysql 索引拍脑袋设计

设计联系人表的时候,设想用uid和cid作联合索引,把uid放在前面,提高用uid查询的速度(clustered index),结果在实际查询中发现:
1,建表的时候根本不能把`uid`放在key的前面,必须放在后面 PRIMARY key(`cid`,`uid`)
如果这样的话,把Uid作为联合主键一点意义没有,最初的“为了查询而优化”的设计全是拍脑袋的决定!!

mysql> explain select * from contact where uid=1234567890;
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | contact | ALL | NULL | NULL | NULL | NULL | 1 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

[b]做方案还是需要对每一个点进行测试,避免提前“思考”优化。[/b]




DROP TABLE IF EXISTS `contact`;

CREATE TABLE `contact` (
`cid` bigint AUTO_INCREMENT NOT NULL,

`uid` bigint NOT NULL,

`email` varchar(128) NOT NULL,

`name` varchar(64) NOT NULL,

`mobile` varchar(16) NULL,

`atime` timestamp NULL,

`type` enum('BLACK','WHITE','NORMAL') NOT NULl default 'NORMAL',

`info` text NULL,

`memo` varchar(1024) NULL,

PRIMARY key(`uid`,`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT = 100;


ALTER TABLE `contact` ADD UNIQUE INDEX uniq_uid_email(`uid`,`email`);




Clustered Index 是与物理数据混在一起并对物理数据进重排,就像使用拼音查字典;Unclustered Index 是与物理数据完全分离的,利用额外空间对关键字进行重排,就像使用部首查字典。


1.直接创建索引和间接创建索引

直接创建索引: CREATE INDEX mycolumn_index ON mytable (myclumn)

间接创建索引:定义主键约束或者唯一性键约束,可以间接创建索引

2.普通索引和唯一性索引

普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)

唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

3.单个索引和复合索引

单个索引:即非复合索引

复合索引:又叫组合索引,在索引建立语句中同时包含多个字段名,最多16个字段

CREATE INDEX name_index ON username(firstname,lastname)

4.聚簇索引和非聚簇索引(聚集索引,群集索引)

聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH

ALLOW_DUP_ROW(允许有重复记录的聚簇索引)

非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn


索引的使用

1.当字段数据更新频率较低,查询使用频率较高并且存在大量重复值是建议使用聚簇索引
2.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
3.复合索引的前导列一定好控制好,否则无法起到索引的效果。如果查询时前导列不在查询条件中则该复合索引不会被使用。前导列一定是使用最频繁的列
4.多表操作在被实际执行前,查询优化器会
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值