- 浏览: 508827 次
- 性别:
- 来自: 大连->北京
文章分类
最新评论
-
春天好:
写的很不错 推荐一个免费好用的云端爬虫开发平台不需要安装环境, ...
web爬虫 -
cpu88:
网络爬虫爬来爬去,网上信息可以瞬间扩散,但是也意味着,没有人愿 ...
web爬虫 -
biaoming:
牛。。学习了。。
MongoDB 关于索引的建议 -
biaoming:
楼主用mongo好早啊。
MongoDB 优化 -
biaoming:
好教程,学习了。。。
MongoDB 优化
Hash索引
Hash索引是建立在Hash table至上的,并且它只对准确查找有效,也就是说,必须查找索引上的每一个列。对于每个行,存储引擎计算了索引列的Hash code。这个hash code是非常小,并且对于其他行不同的数值,这些Hash code也是不相同的。在索引中存储了hash code并且在hash table中存储了一个指针指向每一行。
在MySQL中,只有Memory存储引擎支持显式的Hash索引。虽然Memory表也可以使用B-Tree索引,但是它们是默认的索引类型是Hash索引。Memory引擎支持非唯一的Hash索引,这在数据库领域中是不寻常的。如果多个值有相同的Hash code,那么索引就会在在相同的hash table的实体中,使用一个linked list保存这些值所属行的指针。
说一个例子吧,假设表结构如下
CREATE TABLE testhash (
fname VARCHAR(50) NOT NULL,
lname VARCHAR(50) NOT NULL,
KEY USING HASH(fname)
) ENGINE=MEMORY;
包含的数据如下:
mysql> SELECT * FROM testhash;
+--------+-----------+
| fname | lname |
+--------+-----------+
| Arjen | Lentz |
| Baron | Schwartz |
| Peter | Zaitsev |
| Vadim | Tkachenko |
+--------+-----------+
假设我们有一个hash的函数叫f(),它会返回如下值(这些都是例子,并不是真实的值):
f('Arjen') = 2323
f('Baron') = 7437
f('Peter') = 8784
f('Vadim') = 2458
索引的数据结构为
Slot Value
2323 Pointer to row 1
2458 Pointer to row 4
7437 Pointer to row 2
8784 Pointer to row 3
要注意的是这个slot是有序的。但是行并不是有序。现在我们执行下面的查询
mysql> SELECT lname FROM testhash WHERE fname='Peter';
MySQL将会计算Peter的hash值,并且用它来找到索引中的指针。因为f(peter)=8784。MySQL会在索引中查找8784,也就找到了它的指针,指向行3。最后一步就是把行3的值和Peter做个比较。来确定是否是正确的行。
因为索引本身存储的就是比较短的Hash值,所以hash索引是压缩的。hasn值的长度和列的类型并没有什么关系。对一个tinyint创建一个hash索引的长度和一个值非常大列类型的长度是一样的。
因此查找是非常轻量和快速的。然而,hash索引有如下的限制:
- 因为索引仅仅包含了hash值和行的指针,而并不是数据本身,所以MySQL并不能使用在索引中的值,而去避免读取行。幸运的是,访问内存中的行是非常快的,因此一般来说不太会降低性能。
- MySQL不能对排序使用hash索引。因为它们没有存储排序后的行。
- Hash索引不支持部分键的匹配,因为它们计算的是整个索引值的hash值。所以如果你对(A,B)进行hash索引,并且你的查询仅仅以A的条件进行查询,此时Hash索引就会失效。
- Hash索引只支持是否相等的一些比较。比如=,IN(),<=>操作都可以。(注意<>和<=>不是一样的)。它们不能加速范围查询。比如WHERE PRICE>100。
- 在hash索引访问数据是非常快速的,除非有一些冲突(许多值有相同的hash值)。当冲突出现的时候,存储引擎必须找到每个linked list中的指针所指向的行,并且比较这些行的值和要查找的值作比较,直到找到正确的行。
- 如果有许多hash值冲突,那么索引的维护操作将会非常慢。比如,如果你在一个列上创建了一个索引并且索引值冲突很多,那么之后你从表中删除一个行,从索引找到正确的指针的消耗是非常大的。存储引擎会在Linked list中查找具有相同hash值每一行的指针,然后找到了再删除这个要删除行的引用。
创建自己的hash索引
处理hash冲突
如果你要使用hash来搜索的话,你必须要在WHERE条件中包含它hash之前的值。比如
mysql> SELECT id FROM url WHERE url_crc=CRC32("http://www.mysql.com")
-> AND url="http://www.mysql.com";
下面的语句就不是正确的。因为另一个URL的Hash值也是1560514994,这个语句会把它们都查找出来。
mysql> SELECT id FROM url WHERE url_crc=CRC32("http://www.mysql.com");
Hash的冲突情况增长的速度可能超出你的想象。这是由于所谓的Birthday Paradox所引起的。CRC32()返回的一个32bit整型值。因此可能93000值就会有1%的冲突。为了证明这点,我们把/usr/share/dict/words所有word写入到表中。结果写入了98,569行。已经有了一个冲突了。冲突会使以下的查询返回很多行
mysql> SELECT word, crc FROM words WHERE crc = CRC32('gnu');
+---------+------------+
| word | crc |
+---------+------------+
| codding | 1774765869 |
| gnu | 1774765869 |
+---------+------------+
正确的查询语句
mysql> SELECT word, crc FROM words WHERE crc = CRC32('gnu') AND word = 'gnu';
+------+------------+
| word | crc |
+------+------------+
| gnu | 1774765869 |
+------+------------+
为了避免冲突,你必须在where条件中同时指定这两个条件。如果冲突不是一个问题,就在WHERE条件后仅仅指定CRC32,这个情况下,你可能执行的是关于统计的语句而不需要准确的结果。这样还能获得更高的效率。
发表评论
-
查询性能的优化 - 语句执行的基础 - 查询优化的过程 (一)
2010-01-20 12:00 3509在语句生命周期的下一步就是把一个SQL查询放入一个可执行 ... -
查询性能的优化 - 语句执行的基础 - 已缓存的查询语句
2009-12-01 09:58 1228在解析一个查询之前,如果缓存开启,MySQL要检查它的缓存。这 ... -
查询性能的优化 - 语句执行的基础 - MySQL 客户端/服务端 协议
2009-12-01 01:25 1961MySQL 客户端/服务端 协 ... -
查询性能的优化 - 语句执行的基础
2009-11-30 00:36 1053如果你想从MySQL服务器获得很高的性能,建议你花费一定的时间 ... -
查询性能的优化 - 重新构建查询的方法 - 分解JOIN查询
2009-11-29 11:54 1868分解JOIN查询 许多高性能的网站都分解了JOIN查询。你可 ... -
查询性能的优化 - 重新构建查询的方法 - 拆分一个查询语句
2009-11-28 23:17 1535拆分一个查询语句 另一个分解查询的方法是分步解决。本质上来 ... -
查询性能的优化 - 重新构建查询的方法 - 复杂查询VS多个查询语句
2009-11-28 01:32 1556当开始优化有问题的查 ... -
查询性能的优化 - 查询慢的基础知识:优化数据访问
2009-08-19 14:50 1682一个查询执行的不是 ... -
查询性能的优化 - 前言
2009-08-12 16:49 1030上一章,我们解释了怎样优化schema.这是高性能的一个必要条 ... -
Schema的优化和索引 - 关于存储引擎的简单记录
2009-08-12 15:26 1106这一章的结束,我们来说一下关于设计模型的存储引擎的选择,这些你 ... -
Schema的优化和索引 - 加速ALTER TABLE
2009-08-12 14:02 1882当对于一个大表进行ALTER TABLE的时候,性能问题就产生 ... -
Schema的优化和索引 - 范式和非范式
2009-08-12 11:35 1731有很多方法来展现给定的数据。从完全范式到完全的非范式以及介于两 ... -
Schema的优化和索引 - 索引和表的维护
2009-08-10 15:38 1465当你已经创建了一张表 ... -
Schema的优化和索引 - 学习一个索引示例
2009-08-06 14:09 1154用例子来理解索引的概 ... -
Schema的优化和索引 - 高性能的索引策略 - 索引和锁
2009-07-31 15:48 1054InnoDB中,索引所扮演的角色是非常重要的。因为它们可以能让 ... -
Schema的优化和索引 - 高性能的索引策略 - 冗余和重复的索引
2009-07-31 11:37 2102MySQL可以在一个列上创建多个索引;这么做并不会提醒和防止发 ... -
Schema的优化和索引 - 高性能的索引策略 - 压缩索引(Packed Indexes)
2009-07-30 21:30 1458MyISAM使用前缀压缩来降低索引的大小,这样就可以把更多的索 ... -
Schema的优化和索引 - 高性能的索引策略 - 使用索引扫描来进行排序
2009-07-28 10:43 2239MySQL有两种方法生成有序的结果:使用文件排序或者按顺序的扫 ... -
Schema的优化和索引 - 高性能的索引策略 - 覆盖索引(Covering Indexes)
2009-07-22 15:25 2617索引是高效找到行的一 ... -
Schema的优化和索引 - 高性能的索引策略 - 聚簇索引(Clustered Indexes)
2009-07-20 23:29 3177聚簇索引并不是一个独立的索引类型。确切的说它们是存储数据的一个 ...
相关推荐
- `index_type`: 索引的类型,如BTREE、HASH等。 - `comment`: 关于索引的注释。 - `index_comment`: 索引的用户定义注释。 #### 四、检查MySQL索引是否生效 为了确保索引能够正常工作并提高查询效率,我们需要...
常见的索引类型有B树索引(B-Tree)、哈希索引(Hash)、全文索引(Full-text)和空间索引(Spatial)。选择合适的索引类型对于优化查询性能至关重要。 数据库备份和恢复是保障数据安全的重要手段,常见的策略有...
常见的索引类型包括B-Tree、Hash、R-Tree和Full-text等。B-Tree是最常见的一种,适用于大部分情况,特别是范围查询。 1. **理解索引的选择性**:索引的选择性是指不重复的索引值数目与表行数的比例。选择性越高,...
Hash索引则适合等值查找,但不支持范围查询;R-Tree用于空间数据索引;Full-text索引则用于全文搜索。 要导出MySQL数据库中的所有索引信息,我们可以编写一个SQL查询或者使用特定工具。例如,使用以下SQL语句可以从...
常见的索引类型有B-Tree索引、Hash索引、全文索引等。 6. 视图:视图是虚拟的表,基于一个或多个表的查询结果。它可以简化复杂的查询,提供数据安全性和逻辑数据分离。 7. 存储引擎:MySQL支持多种存储引擎,如...
- 常见的数据索引结构包括B树(B-tree)和哈希(Hash)索引。 - **为什么使用数据索引能提高效率**: - B树索引中的数据存储是有序的,因此可以通过索引直接定位到特定的数据记录,避免全表扫描。 - 查询效率接近二分...
在本文中,我们将讨论 MYSQL 优化方案,涵盖 BIOS 设置优化、IO 子系统优化、Schema 设计优化、索引设计优化和无法使用索引的场景等方面的知识点。 BIOS 设置优化 在 BIOS 设置优化中,我们需要选择合适的系统配置...
B-TREE、HASH、R-TREE等不同类型的索引有各自的适用场景,理解它们的工作原理对于优化至关重要。 存储引擎的选择也是MySQL优化的重要部分。InnoDB作为默认的事务安全存储引擎,提供了行级锁定和外键支持,适用于...
理解B-Tree、Hash、Full-text等各种类型的索引,根据数据分布和查询模式选择最合适的类型。复合索引能进一步提升特定查询性能,但要注意保持索引列的顺序与查询条件一致。同时,定期分析和优化索引,如使用ANALYZE ...
- **选择合适的索引类型**:BTree索引适合范围查询和排序,Hash索引只适用于等值查询且不支持排序,全文索引用于全文搜索。 - **索引维护**:定期分析和优化索引,避免因数据分布变化导致索引效率下降。 - **避免...
B-Tree、Hash、Full-text等不同类型的索引适用于不同的查询场景。在创建索引时,应考虑字段的选择性、更新频率等因素。同时,避免在索引列上使用函数,否则可能导致索引失效。 查询语句的优化也是关键。尽量减少全...
- **索引类型**:B+tree索引、Hash索引、全文索引;聚簇索引(主键索引,包含完整数据)和二级索引(辅助索引,不含完整数据);单列索引、联合索引。 5. **索引优化**: - **选择合适的索引类型**:根据查询需求...
常见的索引类型有B-Tree、Hash、R-Tree和Full-text等,其中B-Tree是最常用的一种,适用于范围查询和排序。 **优化实战范例**中,我们可以学习如何为经常用于查询的列创建索引,如何避免在WHERE子句中使用不等操作符...
- 索引优化:理解B-TREE、HASH索引的工作原理,何时使用全文索引,以及如何通过EXPLAIN分析查询性能。 - 查询优化:避免全表扫描,合理使用LIMIT,减少子查询,优化JOIN操作。 - 表设计:范式理论,选择合适的...
- 深入解析了B-Tree、Hash、R-Tree等不同类型的索引及其工作原理。 - 如何选择合适的索引策略,如单列索引、复合索引、覆盖索引和全文索引。 - 索引维护和重建,以及如何避免索引碎片。 4. **存储优化**: - ...
- 索引策略:创建和管理合适索引,如B-TREE、HASH、全文索引等,以及何时使用覆盖索引和组合索引。 2. **存储引擎**: - InnoDB与MyISAM:对比InnoDB(事务安全,行级锁定)和MyISAM(非事务安全,表级锁定)的优...
- B-Tree和Hash索引:理解两种主要的索引类型及其优缺点,以及如何根据查询需求选择合适的索引类型。 - 聚集索引与非聚集索引:了解索引的组织方式对查询性能的影响。 - 索引覆盖:理解如何利用索引来提高查询...
理解B-Tree、Hash和Full-text等不同类型的索引,以及如何选择合适的索引策略至关重要。注意避免索引滥用,以及创建复合索引来覆盖更广泛的查询需求。 2. **查询优化**:学习如何编写高效的SQL语句,避免全表扫描,...
- B-Tree, Hash, R-Tree, Full-text 等不同类型的索引。 - 索引的选择与维护,包括何时使用唯一索引和非唯一索引。 6. **查询优化**: - 使用EXPLAIN分析查询执行计划。 - 避免全表扫描,利用索引。 - 使用...
- 学习如何创建、管理和使用不同类型的索引,如B-Tree、Hash、Full-text等。 - 优化索引策略,包括合理选择索引类型、避免全表扫描、使用覆盖索引等。 7. **视图与存储过程** - 视图可以简化复杂的查询,提供...