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

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,occur_time,cabid等四个列上面
CREATE INDEX idx_geoinfo_tiny_objectid_occupancy_time_cabid ON geoinfo_tiny (objectid,occupancy,occur_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,6个字段,从.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)

待测试的查询语句:

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

测试1:不建立任何索引,直接查询

结果:

[SQL] SELECT objectid,occur_time,cabid from geoinfo_tiny where cabid='eckecky' and time(occur_time)>time('07:00:00') and time(occur_time)<time('12:00:00')
ORDER BY occur_time ASC 受影响的行: 0 时间: 4.254s

测试2:只在cabid列上建立索引

CREATE INDEX idx_geoinfo_tiny_cabid ON  geoinfo_tiny (cabid)

结果:

[SQL] SELECT objectid,occur_time,cabid from geoinfo_tiny where cabid='amwibs' and time(occur_time)>time('07:00:00') and time(occur_time)<time('12:00:00')
ORDER BY occur_time ASC
受影响的行: 0 时间: 0.147s

测试3:只在occur_time列上建立索引

CREATE INDEX idx_geoinfo_tiny_time ON  geoinfo_tiny (occur_time)

结果:

[SQL] SELECT objectid,occur_time,cabid from geoinfo_tiny where cabid='ancorjo' and time(occur_time)>time('07:00:00') and time(occur_time)<time('12:00:00')
ORDER BY occur_time ASC 受影响的行: 0
时间: .668s

测试4:在cabid、occur_time列上分别建立单列索引(此时该表上有2个单列索引)

结果:

[SQL] SELECT objectid,occur_time,cabid from geoinfo_tiny where cabid='atfrim' and time(occur_time)>time('07:00:00') and time(occur_time)<time('12:00:00')
ORDER BY occur_time ASC 受影响的行: 0
时间: 0.195s

测试5:在cabid、occur_time列上建立组合索引(此时该表上只有一个组合索引,没有单列索引)

结果:最少0.038s,最多0.305s

测试6:在cabid,occur_time,objectid,occupancy四个列上建立组合索引

结果:4.249s-4.703s

测试结果分析:

对比测试1、测试2可知,建立索引之后查询速度大大提升。

对比测试2、测试3可知,建立单列索引时,最好选择在int、float型等基本类型的列上建索引,若在复杂数据类型如datetime等列上,效果较差,和没建一样。

对比测试2、测试4可知,增加单列索引并不一定能提高查询速度。

对比测试2、4、5可知,组合索引比分别建两个单列索引似乎更有效。

对比测试1、2、4、6可知,建组合索引时,并不是列越多越好,若与where子句无关的列参与进来会使得索引失去效果,甚至更糟。

更多注意事项,请参考http://itindex.net/detail/54651-mysql-%E5%AD%A6%E4%B9%A0-%E7%B4%A2%E5%BC%95

MySQL建立索引的注意事项的更多相关文章

  1. paip.提升性能--- mysql 建立索引 删除索引 很慢的解决.

    paip.提升性能--- mysql 建立索引 删除索引 很慢的解决. 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blo ...

  2. navicat为mysql建立索引

    索引的目的是大大提高查询效率,还有读写效率. kettle向sql里面插入,更新时,也要建立索引,可以大大提升处理时间. 但是建立索引报错:Specified key was too long; ma ...

  3. mysql使用索引的注意事项

    使用索引的注意事项 使用索引时,有以下一些技巧和注意事项: 1.索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索 ...

  4. mysql建立索引的几大原则

    (转)仅供自己学习,特此记录 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录.例如,学生表中学号是具有唯一性的字段.为该字段建立唯一性索引可以很快的确定某个学生的信息 ...

  5. mysql建立索引 删除索引

    建立索引 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE ...

  6. 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

    先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...

  7. 如何为mysql建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...

  8. mysql建立索引类型及索引建立的原则

    索引类型:Unique(唯一索引,一般为主键),Normal(一般索引,普通字段,可做组合索引),索引方法:BTREE 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录 ...

  9. mysql 建立索引场合及索引使用

    索引建立场合: ① where后边字段 适合建立索引 ② order by 排序字段适合建立索引 ③ 索引覆盖 即 所要查询的字段本身就是索引 直接在索引中查询数据. 例如 select name,a ...

随机推荐

  1. 第十二章:window对象

    第十一章介绍了window对象及其客户端javascript所扮演的核心角色:它是客户端javascript程序的全局对象.本章介绍window对象的属性和方法,这些属性定义了不同的API,但是只有一 ...

  2. AngularJS-MVC

    前言: 编程是一个很苦恼的工作,因为需要我们不断的去学习,不断的去专研,我本身就不是一个很喜欢学习的孩子,要不然从小到大也没有成绩好过,但是,我从来没有缺少过勤奋,还是让我们言归正传来说下 我们这段时 ...

  3. AngularJS——grunt神器的安装

    前言: 刚开始学 angularJS,在慕课网上看的大漠老师的视频(http://www.imooc.com/learn/156),里面刚开始讲述了前端开发-调试-测试所使用的手段和工具,本人对前端开 ...

  4. Daily Scrum – 1/18

    Meeting Minutes 完成了User Course, 与 Tips 的设计; 修复了一系列Bug; 完成了夜间模式: Burndown Progress part 组员 今日工作 Time ...

  5. Tomcat_修改代码后tomcat是否需要重启

      在修改一个类时,如果没有修改到已经贮存于虚拟机的实例,在你重新编译后,发布至classes,都不需要重启. 怎样才叫已经贮存于虚拟机的实例呢: 1.成员变量 2.类名称 3.方法名 ………… 如果 ...

  6. Weblogic 启动报错:java.lang.NoClassDefFoundError

    Weblogic 启动报错:java.lang.NoClassDefFoundError  ####<2015-6-17 下午03时30分47秒 CST> <Error> &l ...

  7. 在VS2012中编译WinXP兼容的程序

    VS2012默认是不兼容Windows XP的,编译链接出来的程序只能在Windows Vista及以上版本的操作系统上运行.可是有时需要在Windows XP上运行,又不得不用VS2012(例如用了 ...

  8. 【BZOJ-2223】PATULJCI 可持久化线段树

    2223: [Coci 2009]PATULJCI Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 728  Solved: 292[Submit][S ...

  9. BZOJ2121 字符串游戏

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其 他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

  10. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...