普通索引是最基本的索引类型,没有唯一性之类的限制,其作用只是加快对数据的访问速度,索引值可出现多次。。
创建普通索引脚本 /** * 1、新增时创建索引 */ CREATE INDEX indexName ON table_name (column_name); /** * 2、创建表以后,添加索引,修改表结构(添加索引) */ ALTER table tableName ADD INDEX indexName(columnName);
唯一索引与普通索引类似,两者不同点在于:唯一索引的索引列的值必须唯一(除了NULL外,NULL可能会出现多次),但允许有空值。如果是组合索引,则列值的组合必须唯一。需要特别说明的是,主键也是一种唯一索引,但它必须指定为“PRIMARY KEY”。
创建索引的主要原因是减少查询索引列操作的执行时间,尤其是对比较庞大的数据表。
创建唯一索引脚本 /** * 1、新增时创建索引.这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。 * 关于 length : 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。 */ CREATE UNIQUE INDEX indexName ON mytable(columnName(length)) ; /** * 2、创建表以后,添加索引.这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。 */ ALTER table mytable ADD UNIQUE [indexName] (columnName(length)); /** * 3、主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。 * 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 */ ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
组合索引是在多个字段上创建一个索引。
组合索引是针对单列索引的一种划分。单列索引是在数据表中的某一个字段上创建的索引,一个表中可以创建多个单列索引。
组合索引可起几个索引的作用,但是使用时并不是随便查询哪个字段都可以使用索引,而是遵循“最左前缀”:利用索引中最左边的列集来匹配行,这样的列集称为最左前缀。 例如:这里由id、name 和 age 3 个字段构成的索引,索引行中按 id/name/age 的顺序存放,索引可以搜索下面字段组合:(id、name、age)、(id、name) 或者 id.如果列不构成索引最左前缀原则,Mysql不能使用局部索引,如(age)或者(name、age)组合则不能使用索引查询。创建组合索引脚本 ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);
图解 :
图解 :
FULLTEXT 全文索引可以用于全文搜索。只有 MyISAM 存储引擎支持 FULLTEXT 索引,并且只为 CHAR 、VARCHAR 和 TEXT 列。索引总是对整个列进行,不支持局部(前缀)索引。
创建全文索引脚本 /* * 创建全文索引脚本,该语句指定了索引为 FULLTEXT ,用于全文索引。 */ ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);
空间索引必须在 MyISAM类型的表中创建,且空间类型的字段必须为非空。
过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
同时,建立索引会占用磁盘空间的索引文件。
删除索引脚本 /** * 删除索引,第一种语法 */ ALTER TABLE table_name DROP INDEX index_name; /** * 删除索引,第二种语法 */ DROP INDEX index_name ON table_name;
说明:添加 AUTO_INCREMENT 约束字段的唯一索引不能被删除。删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,则整个索引将被删除。
查看索引脚本 /** * 查询表索引语法 */ SHOW INDEX FROM table_name; /** * 例:查询 exp 表的索引 */ SHOW index from exp;
关键字关键字说明Table表示创建索引的表Non_unique表示索引非唯一,1-代表是非唯一索引,0-代表唯一索引Key_name表示索引的名称Seq_in_index表示该字段在索引中的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序。Column_name表示定义索引的列字段Sub_part表示索引的长度Null表示该字段是否能为空值Index_type表示索引类型
EXPLAIN 语句用于分析查询的SQL语句的执行,看一条查询的SQL语句是怎么去执行的,有没有用到索引,需不需要回表查询,需不需要额外排序的情况,然后我们针对SQL语句执行来进行一些特定语句。
关键字关键字说明备注idid 指执行的优先级,id越大优先级越大;值相同的时候,从上往下,依次执行。-select_typeselect_type 行指定所使用的 SELECT 查询类型,这里值为 SIMPLE 表示简单的 SELECT,不使用 UNION 或子查询。其他可能的取值有:PRIMARY、UNION、SUBQUERY 等。SIMPLE(表示简单查询,其中不包括连接查询和子查询)、PRIMARY(表示主查询,或者是最外层的查询语句)、UNION(表示连接查询的第二个或后面的查询语句)tabletable 行指定数据库读取的数据表的名字,它们按被读取的先后顺序排列。-typetype 行指定了本数据表与其他数据表之间的关联关系,从好到坏依次是:system,const,eq_ref,ref,range,index,all.system(表中只有一条数据,引擎只能使MYISAM和MEMORY)、const(使用唯一索引或者主键,用where限制条件后返回一条数据,有且只有一条)、eq_ref(唯一性索引,对每个索引的查询只能返回匹配的唯一一条数据)、ref(非唯一性索引,对每个索引返回匹配的所有)、range(索引指定范围的行,where后边是范围)、index(查询索引的全部数据) 和 all (查询所有数据)possible_keyspossible_keys 行给出了 Mysql 在搜索数据记录时,可选用的各个索引。-keykey 行是 Mysql 实际选用的索引。-key_lenkey_len 行给出索引按字节计算的长度,key_len数值越小,表示越快。-refref 行给出了关联关系中另一个数据表里的数据列的名字。-rowsrows 行是 Mysql 在执行这个查询时,预计会从这个数据表里读出的数据行的个数。-extraextra 行提供了与关联操作有关的信息。可能的取值有 using filesort 、using temporary、using index、using where、impossible whereusing filesort (需要额外的排序,性能损耗)、using temporary(使用到了临时表,性能损耗) 、using index(索引覆盖,性能提升)、using where(需要回表查询)、impossible where(where子句永远为false)
以下几种情况会造成索引失效,使用explain命令加在要分析的sql语句前面,在执行结果中查看key这一列的值,如果为NULL,说明没有使用索引。
1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。 2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效。 3、组合索引,不是使用第一列索引,索引失效。 4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。 5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。 6、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0. 7、对索引字段进行计算操作、字段上使用函数。 8、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。.