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)

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




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.多表操作在被实际执行前,查询优化器会

你可能感兴趣的:(mysql,mobile)