a. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
b. 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
c. 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
d. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
e. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点
a. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
b. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。
c. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
SHOW FULL PROCESSLIST可查看当前状态;
sleep:线程正在等待客户端发送新的请求;
Query:线程正在执行查询或者正在将结果发送给客户端;
Locked:该线程正在等待表锁;
Analyzing and statistics:线程正在收集存储引擎的统计信息,并生产查询的执行计划;
Coping to tmp table:线程正在执行查询,并将其结果复制到临时表中;
Sorting result:线程正在对结果集进行排序;
Sending data:线程可能在多种状态之间传送数据,或者正在生成结果集,或者正在向客户端发送数据;
查询性能优化
1、慢查询基础:优化数据访问
低效查询分析方法:
a. 确认应用程序是否在检索大量超过需要的数据。通常意味着访问了太多的行,也有可能访问太多的列。
b. 确认mysql服务器层是否在分析大量超过需要的数据行。
低效查询典型案列:
a. 查询不需要的记录
b. 多表关联时返回全部列
c. 总是取出全部列
d. 重复查询相同的数据
衡量查询开销的三个指标:
a. 响应时间 响应时间包括服务时间和排队时间;服务时间:是指数据库处理这个查询真正花了多长时间,排队时间:服务器因为等待某些资源而没有真正执行查询的时间(可能是IO,行锁等等);
b. 扫描的行数
c. 返回的行数 较短的行的访问速度更快,内存中的行比磁盘中的行访问速度更快;较短的行数,是在内存中查询,当行数较多时则在磁盘中查询;
将查询方式进行重构
a. 一个复杂查询还是多个简单查询
b. 切分查询(大查询分为小查询,例如:大扫描行数查询切分成多个小扫描行数的查询)
c. 分解关联查询,优点:让缓存效率更高;让单个查询减少锁竞争;在应用层做关联,容易对数据库进行拆分,提高系统性能;减少冗余记录的查询;