2. 知识剖析
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
创建索引时,你需要确保该索引是应用在SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度。
因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
普通索引
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。
只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {column} )
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
在对该列进行增或改时,首先会检查是否重复,在执行增改操作,否则报出duplica错误,拒绝操作。
mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {lolumn} )
3. 常见问题
如果表中没有所以会发生什么?
一旦我们运行这个查询,在查找名字AAA的过程中,数据库不得不对表中的每一行检索并确定名字是否为AAA。
由于我们想要得到每一个名字为AAA的用户信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。
所以,必须一行一行的查找直到最后一行这就意味数据库不得不检查上千行数据才能找到所以名字为AAA的用户。这就是所谓的全表扫描。
索引是怎么提升性能的?
因为索引基本上是用来存储列值的数据结构,这使查找这些列值更加快速。
如果索引使用最常用的数据结构-B-Tree-那么其中的数据是有序的。
假设我们在name一列上创建一个B-Tree索引。这意味着当我们用之前的SQL查找姓名是AAA的用户时,不需要再扫描全表,而是用索引查找去查找名字为AAA的用户。
因为索引已经按照按字母顺序排序。索引已经排序意味着查询一个名字会快很多,因为名字少字母为AAA的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。
4. 解决方案
使用索引的原则:
1、装载数据后再建立索引。
2、频繁搜索的列可以作为索引。
3、在联接属性上建立索引(主外键)。
4、经常排序分组的列。
5、删除不经常使用的索引。
6、指定索引块的参数,如果将来会在表上执行大量的insert操作,建立索引时设定较大的ptcfree。
7、指定索引所在的表空间,将表和索引放在不同的表空间上可以提高性能。
8、对大型索引,考虑使用NOLOGGING子句创建大型索引。
不要在下面的列创建索引:
1、仅包含几个不同值得列。
2、表中仅包含几条记录。
DEMO
先创建user表
CREATE TABLE user(
id INT NOT NULL,
number INT NOT NULL
);
普通索引
ALTER TABLE USER ADD INDEX ID_INDEX(ID);
唯一索引
ALTER TABLE USER ADD UNIQUE NUMBER_INDEX(NUMBER);
查看索引
SHOW INDEX FROM USER;