MySQL建立索引的注意事项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL建立索引的注意事项相关的知识,希望对你有一定的参考价值。

对于大数据量的表格,尤其是百万行以上的数据表,一定要对其建立索引,否则查询速度极慢。(参考后面的测试结果)
建立索引时需注意:

mysql的索引有两种:单列索引(即在某一列上建索引)、多列组合索引(即在多个列上建立同一个索引),不像SQL Server分聚集索引,非聚集索引。

如何建立单列索引:

格式:CREATE INDEX 索引名 on 表名(列名)

例如:
CREATE
INDEX idx_geoinfo_tiny_cabid ON geoinfo_tiny (cabid)#创建一个名为idx_geoinfo_tiny_cabid的索引,该索引建立在geoinfo_tiny表上的cabid列上面

如何建立多列组合索引:

格式:CREATE INDEX 索引名 on 表名(列名1,列名2,列名3,...)

例如: #创建一个名为idx_geoinfo_tiny_objectid_occupancy_time_cabid的索引,该索引建立在geoinfo_tiny表上的
objectid,occupancy,time,cabid等四个列上面
CREATE
INDEX idx_geoinfo_tiny_objectid_occupancy_time_cabid ON geoinfo_tiny (objectid,occupancy,time,cabid)

应该在哪个列上建立索引?建组合索引还是单列索引?

先说第一问,应该在哪个列上建立索引?

答:得根据自己的查询需求来,哪一列需要经常查询就在哪一列上建索引,一般是sql语句中where子句中的列,例如对于sql语句

SELECT objectid,occur_time,latitude,longitude,cabid from geoinfo_tiny where cabid=afmorc and time(occur_time)>time(07:00:00) and time(occur_time)<time(12:00:00)
ORDER BY occur_time ASC

where子句中作为判断依据的cabid列和time列,这两个列上应该建立索引。

至于该建立组合索引还是单列索引,如不能确定,可以都试试,看哪个效果好。

我本机上有一个表,名为geoinfo_tiny,4个字段,从.txt文件导入了2,867,457行数据(如何使用Python快速、大批量地导入数据,请看http://www.cnblogs.com/aaronhoo/p/5152292.html)。

创建表:

CREATE TABLE `geoinfo_tiny` (
`objectid`  int(11) NOT NULL AUTO_INCREMENT ,
`latitude`  double NOT NULL ,
`longitude`  double NOT NULL ,
`occupancy`  bit(1) NOT NULL ,
`occur_time`  datetime NOT NULL ,
`cabid`  varchar(16)

 

测试结果

 

以上是关于MySQL建立索引的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

Mysql在建立索引优化时需要注意的问题

MySQL索引类型总结和使用技巧以及注意事项

MySQL索引类型总结和使用技巧以及注意事项

mysql创建索引需要注意啥

MySQL索引类型总结和使用技巧以及注意事项

MySQL索引类型总结和使用技巧以及注意事项