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

一、索引的优点

1、索引可以大大减少服务器需要扫描的数据量

2、索引可以帮助服务器避免排序和临时表。

3、索引可以将随即I/O变为顺序I/O

二、索引策略

1、独立的列

独立的列是指索引列不能是表达式的一部分,也不能是函数参数。例如:

一个有500W条记录的表,id是主键。

所以要始终将索引列单独放在比较符号的一侧。

2、前缀索引和索引选择性

对于比较大的列,通常可以索引开始的部分字符,这样可以节约索引空间,提高索引率。但是也会降低索引的选择性。

索引的选择性是指,不重复的索引值(基数)和表的记录总数的比值,索引的选择性越高查询效率就越高,因为可以在查找时过滤掉更多的行,唯一索引的选择性是1,性能是最好的。

如何来选择一个合适的长度,让前缀的基数接近完整列的基数,一般我们有2中方法:

a、为了决定前缀的合适长度,需要找到最常见的值的列表,然后和最常见的前缀列表进行比较。

举例:有一张100W记录的表,要对name添加前缀索引

时间: 2024-12-02 05:59:01

高性能的MySQL(5)索引策略的相关文章

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

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

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

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

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

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

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

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

【转载】低成本和高性能的MySQL云数据库的实现淘宝 MySQL

低成本和高性能的MySQL云数据库的实现 作者: 鸣嵩/曹伟(集团技术专家) 本文刊登于<程序员>杂志2012年12期上,转载请注明         UMP(Unified MySQL Platform)系统是淘宝核心系统数据库团队开发的低成本和高性能的MySQL云数据方案,关键模块采用Erlang语言实现.系统中包含了controller服务器.proxy服务器.agent服务器.API/Web服务器.日志分析服务器.信息统计服务器等组件,并且依赖于Mnesia.LVS.RabbitMQ.Z

MySQL数据库索引使用方法

  走向精通MySQL的道路非常的艰难,还好各种关系型数据库大同小异,足够让我从增删改查上升到高性能数据库的架构和调优.这期间的各种概念就不絮叨了,我也很难表述的很清楚,昨天写了个小脚本往我本机MySQL数据库的某张表里面注入了200万条数据(Windows7旗舰版/1.66GHz/2G内存/MySQL5.1.50),数据表的结构如下图所示,属于一个比较基本的定长表,考虑到我可怜的本本的承受能力,id使用从1开始的自增,title字段为随机20个标题中的一个,content都是相同的内容,tim

深入分析MySQL数据库索引

什么是索引 索引是存储引擎用于快速找到记录的一种数据结构,索引类似一本书的目录,我们根据目录可以快速的查找到我们感兴趣的内容.索引就是存储引擎的目录,如果没有索引存储引擎必须遍历整个数据库表来查询符合条件的记录,索引的建立和优化应该是提升查询性能最有效的手段了. 索引的类型 索引是在MYSQL的存储引擎层中实现的,而不是在服务层实现的.所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同. B-Tree索引

MySQL创建索引

MySQL创建索引 如果你在查询时常用类似以下的语句: SELECT * FROM mytable WHERE category_id=1; 最直接的应对之道,是为category_id建立一个简单的索引: CREATE INDEX mytable_categoryid ON mytable (category_id); OK,搞定?先别高兴,如果你有不止一个选择条件呢?例如: SELECT * FROM mytable WHERE category_id=1 AND user_id=2; 你的

MySQL日志维护策略汇总_Mysql

这几天要折腾mysql服务器,所以在网上搜罗了一些维护策略,然后自己总结实验,下面是我的总结经验和别人的一些建议. 日志类型: MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:  日志文件:记入文件中的信息类型 错误日志:记录启动.运行或停止时出现的问题  查询日志:记录建立的客户端连接和执行的语句二进制日志:记录所有更改数据的语句.主要用于复制和即时点恢复慢日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询事务日志:记录InnoDB