高性能的MySQL(5)索引策略-索引和表的维护

维护表有三个主要的目的:

1、找到并修复损坏的表。

对于MyISAM存储引擎来说,表损坏通常是系统崩溃导致的。其他的引擎也会由于硬件的问题,MySQL本身的缺陷或者操作系统的问题导致索引的损坏。

损坏的索引,会导致查询返回错误的结果或者莫须有的主键冲突等问题,严重时还会导致数据库崩溃。

这类情况,可以尝试check table来检查是否发生了表损坏,有些存储引擎不支持这个命令。

可以使用repair table 来修复损坏的表,但同样不是所有引擎都支持该命令。

如果引擎不支持,可以使用alter操作重建表,或者将数据导出然后再重新导入。

InnoDB一般不会损坏,如果发生损坏,一般要么是数据库硬件问题,例如内存或者磁盘问题,要么就是数据库管理员操作导致。

常见的错误是由于尝试使用rsync备份InnoDB导致的。

如果是某条查询导致的,那一定是遇到了bug,而不是查询的问题。

2、维护准确的索引统计信息。

MySQL的查询优化器会通过2个API来了解存储引擎的索引值的分布信息,以决定如何使用索引。

第一个API是records_in_range(),通过向存储引擎传入两个边界值获取在这个范围大概有多少条记录。

对于某些引擎,该接口返回精确值,比方说MyISAM;对于InnoDB则是一个估算的值。

第二个API是info(),该接口返回各种类型的数据,包括索引的基数。

当返回信息不准确的时候,优化器会使用索引统计信息来估算扫描行数。如果表没有统计信息,或者统计信息不准确,优化器很可能做出错误的决定。

可以运行analyze table 来重新生成统计信息。

Memory引擎不存储索引统计信息

MyISAM将索引统计信息存储在磁盘中,analyze table 需要进行一次全表扫描,整个过程需要锁表。

MySQL5.5以后,InnoDB也不在磁盘存储索引统计信息,而是通过随机的索引访问来进行评估并存储在内存中。

使用show index from 命令可以察看索引基数(Cardinality)

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/MySQL/

InnoDB会在首次打开表,或者执行analyze table,或者表大小发生变化超过1/16或show table status,或show index时候都会计算索引的统计信息,如果服务器有大量的数据,这会是个严重的问题,只要show index查看索引统计信息就一定会触发统计信息更新,可以关闭

innodb_stats_on_metadata参数来关闭。

一旦关闭自动更新,那么需要周期性的使用analyze table 来手动更新,否则问题大了。

3、减少索引和数据碎片

B-Tree索引可能会碎片化,这会降低查询效率。碎片化的索引可能会以很差或者无序的方式存储在磁盘上。

可以通过optimize table 或者导出再导入的方式来重新整理数据。

对于不支持optimize table 的存储引擎,可以通过一个不做任何操作的alter table来重建表。

altertable<table> engine=<engine>;

也可以先删除索引,重建表,最后重新创建索引来实现。

索引的介绍就先到这里了,明天进入查询性能优化部分!

本文出自 “phper-每天一点点~” 博客,请务必保留此出处http://janephp.blog.51cto.com/4439680/1314057

时间: 2025-01-18 08:27:24

高性能的MySQL(5)索引策略-索引和表的维护的相关文章

高性能的MySQL(5)索引策略-索引案例分析

理解索引最好的办法是结合实例,接下来分析一个例子. 假设要设计一个在线约会网站,用户信息表有很多列,包括国家,地区,城市,性别,眼睛颜色等等.网站必须支持上面的各种组合来搜索用户,包括根据用户的最后在线时间,评分等进行排序的限制. 需要考虑是需要索引来排序还是先检索数据再排序,因为使用索引排序会严格限制索引和查询的设计.如果MySQL使用了某个索引的范围查询,也就无法再使用另一个索引或者是该索引的后续字段进行排序了.接下来一步步讨论: 1.支持多种过滤条件 country列的选择性通常不高,但是

高性能的MySQL(5)索引策略一压缩,冗余,重复,索引和锁

一.压缩索引 MyISAM使用前缀压缩来减少索引的大小,默认只压缩字符串,但是通过设置也可以对整数做压缩. 压缩可以使用更少的空间,代价是某些操作可能更慢.特别是倒序的查询,测试表明,对于CPU密集型的应用,查询会很慢,特别是倒序.对于I/O密集型应用,查询可能会不错. 可以在CREATE TABLE的语句中指定PACK_KEYS参数来指定索引压缩方式. 二.冗余和重复索引 重复索引:指在相同的列上按照相同的顺序创建的相同类型的索引,要尽量避免重复索引,除非在同一列上创建不同类型的索引来满足不同

高性能的MySQL(5)索引策略-覆盖索引与索引排序

一.覆盖索引 索引是一种查找数据的高效方式,但是MySQL也可以使用索引来直接获取列的数据,这样就不再需要读取数据行.如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要回表查询呢? 如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为"覆盖索引". 覆盖索引的好处: 1.索引条目通常远小于数据行大小,所以如果只需要读取索引,就极大的减少数据访问量.这对MyISAM尤其正确,因为MyISAM能压缩索引以变得更小. 2.因为索引是按照顺序存储的,所以对于I/O密集型的范围

高性能的MySQL(5)索引策略

一.索引的优点 1.索引可以大大减少服务器需要扫描的数据量 2.索引可以帮助服务器避免排序和临时表. 3.索引可以将随即I/O变为顺序I/O 二.索引策略 1.独立的列 独立的列是指索引列不能是表达式的一部分,也不能是函数参数.例如: 一个有500W条记录的表,id是主键. 所以要始终将索引列单独放在比较符号的一侧. 2.前缀索引和索引选择性 对于比较大的列,通常可以索引开始的部分字符,这样可以节约索引空间,提高索引率.但是也会降低索引的选择性. 索引的选择性是指,不重复的索引值(基数)和表的记

高性能的MySQL(5)索引策略一聚簇索引

聚簇索引,并不是一种单独的索引类型,而是一种数据存储方式.InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行信息. 因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引(不过可以通过覆盖索引来模拟,稍后再介绍). 这里主要讨论InnoDB引擎,InnoDB通过主键聚集数据,如果没有主键会选择一个非空的唯一索引,如果还没有,InnoDB会隐式定义一个主键来作为聚簇索引. 聚簇索引是一把双刃剑,要仔细考虑. 优点: 1.可以把相关数据保存在一起,例如实现电子邮件时

MySQL索引背后的之使用策略及优化(高性能索引策略)_Mysql

本章的内容完全基于上文的理论基础,实际上一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑. 示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库关系复杂度适中,且数据量较大.下图是这个数据库的E-R关系图(引用自MySQL官方手册):   图12 MySQL官方文档中关于此数据库的页面为http://dev.mysql.com/doc/employee/

高性能的MySQL(5)创建高性能的索引一哈希索引

哈希索引(hash index)基于哈希表实现,只有精确匹配索引的所有列的查询才有效,对于每一行数据,存储引擎都会对所有索引列计算一个哈希码,不同键值的行计算出来的哈希码也不一样,哈希码保存在哈希索引中,同时哈希表中保存指向每个数据的指针. 1.Memory引擎支持哈希索引,也支持B-Tree索引,而且支持非唯一的哈希索引,如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目,这个是和特别的. 举例说明: CREATE TABLE `testhash` ( `fname`

mysql性能优化之索引优化_Mysql

作为免费又高效的数据库,mysql基本是首选.良好的安全连接,自带查询解析.sql语句优化,使用读写锁(细化到行).事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多.即使有这么多优点,仍依赖人去做点优化,看书后写个总结巩固下,有错请指正. 完整的mysql优化需要很深的功底,大公司甚至有专门写mysql内核的,sql优化攻城狮,mysql服务器的优化,各种参数常量设定,查询语句优化,主

MySQL前缀索引和索引选择性

MySQL前缀索引和索引选择性 有时候需要索引很长的字符列,这会让索引变得大且慢.通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率.但这样也会降低索引的选择性.索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值,范围从1/#T到1之间.索引的选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行.唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的. 一般情况下某个前缀的选择性也是足够高的,足以满足