mysql--索引

来源:互联网 发布:proteus矩阵键盘 编辑:程序博客网 时间:2024/05/21 11:26

索引
您可以在表中创建索引,以便更加快速高效地查询数据。
更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

合理利用主键索引

注意虚外键的索引

delete truncate 和 索引

时间倒序 使用哪个索引

如何选择合适的列建立索引

1.在where从句,group by 从句,order by从句,on从句中出现的列
2.索引字段越小越好 数据存储以一页为单位,一页数据越多,IO数据量大,速度越慢,所以越小越好
3.离散度大的列放到联合索引的前面
select * from payment where staff_id=2 and customer_id=584;
是index(staff_id,customer_id)好,还是index(customer_id,staff_id)好?

由于customer_id的离散度更大,所以应该是用index(customer_id,staff_id)

这里有个离散度的概念,怎么理解这个术语呢?

如果一个字段的唯一值出现越多,离散度越大,用sql来查询比较就是
select count(distinct customer_id),count(distinct staff_id) from payment;

如果一个索引包括了一个查询中的所有列,则称之为覆盖索引

索引的优点:
1、提高查询的效率:select

索引的缺点:
1、降低写入的效率:insert、update、delete
过多的索引不仅影响增加、修改、删除数据的效率,而且也影响查询的效率,这是因为查询的时候数据库需要选择使用索引进行查询呢,那么需要更合理的使用索引(增加合适的索引、删除重复的索引)

索引优化

1、重复索引
查询的时候,如果加载重复索引越多,速度越慢。错误示范:
create table user(
id int not null primary key,
username varchar(10) not null,
address varchar(50) not null,
unique(id)
) engine=innodb;

2、冗余索引
Innodb 中,每个索引都会自动添加上主键,所以索引不用添加主键。错误示范:
create table user(
id int not null primary key,
username varchar(10) not null,
address varchar(50) not null,
key(name, id)
) engine=innodb;

重复索引
使用pt-duplicate-key-checker工具维护索引

使用pt-index-usage工具配合慢查日志删除索引

索引的维护及优化—删除不用索引
目前MySQL中还没有记录索引的使用情况,但是在PerconMySQL和MariaDB中可以通过INDEX_STATISTICS表来查看那些索引未使用,但在MySQL中目前只能通过慢查日志配合pt-index-usage工具来进行索引使用情况的分析。

pt-index-usage \
-uroot -p” \
mysql -slow.log

注意一主多从