MySQL:给表中的字段建索引,这两种写法有什么区别?

想给test_user表中的的uid,cardid,carid建立普通索引,用navicat for mysql 建索引,生成的SQL语句,有下面两种写法,请问有什么区别吗?


CREATE TABLE `test_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增唯一主键ID',
  `uid` smallint(11) DEFAULT NULL COMMENT '用户ID',
  `cardid` smallint(5) DEFAULT NULL COMMENT '卡号',
  `carid` varchar(20) DEFAULT NULL COMMENT '车辆ID',
  `intime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '数据写入时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `base` (`uid`,`cardid`,`carid`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='车辆信息表(测试用)';

-----------------------------------------------------------------------------
CREATE TABLE `test_user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增唯一主键ID',
  `uid` smallint(11) DEFAULT NULL COMMENT '用户ID',
  `cardid` smallint(5) DEFAULT NULL COMMENT '卡号',
  `carid` varchar(20) DEFAULT NULL COMMENT '车辆ID',
  `intime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '数据写入时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `uid` (`uid`) USING BTREE,
  KEY `cardid` (`cardid`) USING BTREE,
  KEY `carid` (`carid`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='车辆信息表(测试用)';
阅读 2.1k
1 个回答

一般情况下建议使用第一种多列索引,但多列索引使用遵循最左前缀原则,列的排序特别重要,经验法则是选择性多的列在前;如果表字段如上比较少的话覆盖索引查询应该比较多。

单列索引的话也可以通过索引合并使用到多个索引,但整体不如第一种好。

建议改为innoDB引擎

建议参考高性能mysql第五章。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题