MySQL优化--使用索引

1.索引的优劣
优:加快查询速率
劣:影响对表的添删改操作的速率,增大文件大小(可能索引文件比数据文件还大),
所以,在往数据库导入大量数据之前,应该先暂时删除索引,数据导入完成后再统一建立索引。

2.索引为什么快?
假设表中有N条记录,N>0,查找某条数据,
不使用索引,平均查找次数N/2;
使用BTree(二叉树)索引,平均查找次数log2N(2是底数);
使用hash索引,平均查找次数1。
建立索引后,查找次数明显变少了,所以更快。

3.建立索引的原则
(1)不过度索引。索引 增加了插入、更新和删除操作的处理时间,增加了物理磁盘的存储空间,创建不必要的索引只会形成浪费,具体如何创建索引还得根据实际业务情况来定夺。

对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作;
②经常性的检查数据表结构,删除不再使用,或者很少被使用的索引;
对于小型的表,建立索引可能会影响性能;

(2)索引应该建在:
primary key 字段, 系统自动创建主键的索引;
unique kye 字段,系统自动创建对应的索引;
foreign key 约束所定义的作为外键的字段;
在查询中用来连接表的字段;
经常进行 order by、group by、distinct 的字段;
经常使用在 Where 子句中的列的字段;
经常需要根据范围进行搜索的字段;
⑧在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定;

不应该建在:
①对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,增加了索引,反而降低了系统的维护速度和增大了空间需求;
②不要在有大量相同取值的字段上建立索引。如性别只有“男”、“女”两个值,增加这样的字段索引,并不能明显加快检索速度;
③对于那些定义为text,image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量是不定长的,数据结果要么相当大,要么取值很少;
④当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能; 

(3)索引的字段应该是散列的,如性别只有“男”、“女”两个值,就没必要使用索引了;

4.索引类型
(1)普通索引(index):加快查询速率;
(2)唯一索引(unique index):值不能重复;
(3)主键索引(primary key):主键会自动加索引,且值是唯一的,但是唯一索引不一定是主键,一张表可以有多个唯一索引,但是只能有一个主键;
(4)全文索引 (fulltext index):该索引在默认情况下,对中文的意义不大。

5.语法

(1)查看表的索引:

show index(es) from tbname;
show keys from tbname;
(2)建立索引:
alter table tbname add index [unique|fulltext] indexname (col1, col2, ...);
alter table tbname add primary key (col1); // 不能添加主键,主键只能有一个
create index indexname on tbname(col1, col2); // 创建联合索引
注:
①修改索引,先删除原有索引,再创建新索引;
②在建表时使用unique约束,该项即成为唯一索引,唯一索引可以为NULL且有多个;
③主键索引不可以为NULL,也不能有多个。

(3)
删除索引:
alter table tbname drop index indexname;
alter table tbname drop primary key; // 删除主键
drop index indexname on tbname;

你可能感兴趣的:(mysql,优化,索引,index)