您的位置:首页 > 数据库 > MySQL

MySQL索引使用以及注意事项

2018-03-23 12:45 302 查看

1. 创建索引

在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。1.ALTER TABLE    ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。    ALTER TABLE table_name ADD INDEX index_name (column_list)    ALTER TABLE table_name ADD UNIQUE (column_list)    ALTER TABLE table_name ADD PRIMARY KEY (column_list)其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。2.CREATE INDEX    CREATE INDEX可对表增加普通索引或UNIQUE索引。    CREATE INDEX index_name ON table_name (column_list)    CREATE UNIQUE INDEX index_name ON table_name (column_list)table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
2.索引类型    在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。PRIMARY KEY索引和UNIQUE索引非常类似。事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。下面的SQL语句对students表在sid上添加PRIMARY KEY索引。        ALTER TABLE students ADD PRIMARY KEY (sid) 3.删除索引可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。 DROP INDEX index_name ON talbe_nameALTER TABLE table_name DROP INDEX index_nameALTER TABLE table_name DROP PRIMARY KEY 其中,前两条语句是等价的,删除掉table_name中的索引index_name。第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。4.分析索引是否命中
MySql中是通过 Explain 命令来分析低效SQL的执行计划。命令的使用很简单.示例 explain select * from adminlog执行结果:
idselect_typetablepartitjonstypepossible_keyskeykey_lenrefrowfilteredExtra
1SIMPLEadminlog ALL    2100 
执行结果每一列的说明:1、 select_type : 查询类型,常见的值[SIMPLE:简单表,不使用表连接或子查询。PRIMARY : 主查询,外层的查询。UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select]2、table :输出结果的表3、type : 表示MySql在表中找到所需行的方式,或者叫访问类型。常见的类型:
ALLindexrangerefeq_refconst,systemNULL
从左到右,性能由最差到最好。  3.1 type=ALL 全表扫描,  3.2 type=index 索引全扫描,遍历整个索引来查询匹配的行  3.3 type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符。  例     explain select * from adminlog where id>0 ,     explain select * from adminlog where id>0 and id<=100    explain select * from adminlog where id in (1,2) 
  3.4 type=ref 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行。ref还经常出现在JOIN操作中   3.5 type=eq_ref 类似于ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配;简单来说,说是多表连接中使用 主建或唯一健作为关联条件  3.6 type=const/system 单表中最多有一个匹配行。主要用于比较primary key [主键索引]或者unique[唯一]索引,因为数据都是唯一的,所以性能最优。条件使用=。   3.7 type=NULL 不用访问表或者索引,直接就能够得到结果 例 explain select 1 from dual,类型type 还有其他值 如ref_or_null : 与ref 类似,区别在于条件中包含对NULL的查询.   index_merge : 索引合并优化, unique_subquery : in的后面是一个主键字段的子查询。index_subquery : 与                             unique_subquery 类似,区别在于in的后面是查询非唯一索引字段的子查询4、possible_keys : 可能使用的索引列表.5、key : 实现执行使用索引列表6、key_len : 索引的长度7、ref : 显示使用哪个列或常数与key一起从表中选择行。8、row : 执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引9、filtered:10、Extra: 该列包含MySQL解决查询的详细信息。  10.1 Not exists    10.2 range checked for each record    没有找到合适的索引  10.5 using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。就是建议取索引列。这样就可以不要通过索引去实际表中找数据了。直接返回索引列的数据。一次查询。否则就是索引表查一次,实际表中查一次。  10.6 using temporary为了解决查询,MySQL需要创建一个临时表来容纳结果。典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时。 无效索引: 数据变化不大的列。如XX类型,是否有效,项目ID等列的索引都是无效的。这些无效索引还是影响Insert 、Update、Delete 语句的性能。因为这些语包的执行都要对索引表进行更新。又因为这些表的值变化不大,数据库很难为他们合理分配索引。所以影响语句的性能。 IN,OR 是否会走索引:一条SQL会不会走索引一个看条件使用的运算符,另一个看有没有索引。所以SQL会不会走索引和IN.OR,group by 没有关系。什么运算符不走索引,<>,!=OR 有个点要注意一下:就OR前后两个条件都要有索引整个SQL才会使用索引。只要有一个条件没索引那么整个SQL都不使用索引。如果出现OR的一个条件没有索引时,建议使用 union 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息