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

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. Grovvy之解析XML文件

    假设现有customer.xml 文件内容如下: <?xml version="1.0" ?> <customers> <corporate> ...

  2. JQuery学习(1)

    JQuery学前准备 JQuery的各种包: 1.jquery-ui(包含小工具及组件) 2.jquery-1.7.1.intellisense.js(智能提示包) 3.jquery-1.7.1.js ...

  3. Java-httpClient警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

    使用HttpClient,总是报出“Going to buffer response body of large or unknown size. Using getResponseBodyAsStr ...

  4. ThinkPHP多表联合查询的常用方法

    1.原生查询示例: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_t ...

  5. BZOJ1968 [Ahoi2005]COMMON 约数研究

    Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input ...

  6. MyEclipse------快速读取特定目录下的文件的内容(字节输入流)

    other.jsp <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  7. std::stringstream

    使用 std::stringstream,小心 内存! 适时 清空 缓冲 …… 2007年12月14日 星期五 : stringstream是个好东西,网上有不少文章,讨论如何用它实现各种数据类型的转 ...

  8. ajax遍历数组(实现百度搜索提示的效果)

    方法一: 页面 <input type="hidden" id="classpath" value="${pageContext.request ...

  9. Jni中C++和Java的参数传递 参数对照

    Jni中C++和Java的参数传递 如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用V ...

  10. HttpResponse对象

    为了响应客户端的请求,同样定义了代表响应的类:HttpResponse类,它也定义在命名空间System.Web下,提供向客户端响应的方法和属性. HttpResponse常用属性和方法 响应对象用于 ...