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

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. 第十七课:js数据缓存系统的原理

    这一章主要讲的是jQuery的缓存系统的历史发展,以及他自己的框架的缓存系统的实现.都是源码解析. 我就挑几个重点讲下: (1)jQuery的缓存机制的原理 jQuery的缓存机制实现的原理是在元素中 ...

  2. 2016 版 Laravel 系列入门教程(二)【最适合中国人的 Laravel 教程】

    本教程示例代码见: https://github.com/johnlui/Learn-Laravel-5 在任何地方卡住,最快的办法就是去看示例代码. 本篇文章中,我将跟宝宝们一起学习 Laravel ...

  3. “耐撕”团队2016.03.28 站立会议

    1. 时间:20:30--20:50 2. 成员: Z 郑蕊 * 组长 (博客:http://www.cnblogs.com/zhengrui0452/), P 濮成林(博客:http://www.c ...

  4. jQuery Mobile学习日记

    本次主讲人是王思伦啦啦啦~ 框架特性 jQuery Mobile 以“Write Less, Do More”作为目标,为所有的主流移动操作系统平台提供了高度统一的 UI 框架:jQuery 的移动框 ...

  5. Jquery-获取同级标签prev,prevAll,next,nextAll

    1.next([expr]): 获取指定元素的下一个同级元素(注意是下一个同级元素哦) 参数可有可无,参数设定遵循jquery选择器规则 <!DOCTYPE html> <html& ...

  6. sql-exists和not exists

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或FalseEXISTS 指定一个子查询,检测行的存在. 实例: (一). 在子查询中使用 NULL ...

  7. Cocos2d-X3.0 刨根问底(一)----- 概览

    罗嗦几句,本系列文章记录了小鱼(本人)自学Cocos2D-X的整个过程,主要从分析Cocos2D-x的源码方式来学习Cocos2d-x这样一个优秀的游戏引擎架构,本着不但要知其然还要知其所以然的学习态 ...

  8. 从TP、FP、TN、FN到ROC曲线、miss rate、行人检测评估

    从TP.FP.TN.FN到ROC曲线.miss rate.行人检测评估 想要在行人检测的evaluation阶段要计算miss rate,就要从True Positive Rate讲起:miss ra ...

  9. BZOJ2463 谁能赢呢?

    Description   小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的 ...

  10. asp.net input怎么获取值

    前台: <input type="hidden" name="content" value="content"> 后台: Req ...