鍍金池/ 問答/數(shù)據(jù)庫/ MySQL:給表中的字段建索引,這兩種寫法有什么區(qū)別?

MySQL:給表中的字段建索引,這兩種寫法有什么區(qū)別?

想給test_user表中的的uid,cardid,carid建立普通索引,用navicat for mysql 建索引,生成的SQL語句,有下面兩種寫法,請問有什么區(qū)別嗎?


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 '數(shù)據(jù)寫入時間',
  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 '數(shù)據(jù)寫入時間',
  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='車輛信息表(測試用)';
回答
編輯回答
離魂曲

一般情況下建議使用第一種多列索引,但多列索引使用遵循最左前綴原則,列的排序特別重要,經(jīng)驗法則是選擇性多的列在前;如果表字段如上比較少的話覆蓋索引查詢應該比較多。

單列索引的話也可以通過索引合并使用到多個索引,但整體不如第一種好。

建議改為innoDB引擎

建議參考高性能mysql第五章。

2018年5月9日 10:46