没有合适的资源?快使用搜索试试~ 我知道了~
索引优化应该是对查询性能优化最有效的手段了。mysql只能高效地使用索引的最左前缀列。mysql中索引是在存储引擎层而不是服务器层实现的B-Tree索引B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。图中根节点没有画出来。B-Tree对索引列是顺序组织存储的,索引很适合查找范围数据。B-Tree索引的限制如果不是按照索引的最左列开始查找,则无法使用索引。不能跳过索引中的列如果查询中有某列的范围查询,则其右边所有列都无法使用索引优化查询。这些限制都和索引列的顺序存储有关系。或者说是索引顺序存储导致了这些限制。哈希索引(hashindex)哈希索引基于哈希表实现的,
资源推荐
资源详情
资源评论
MYSQL索引索引
索引的类型
索引优化应该是对查询性能优化最有效的手段了。
mysql只能高效地使用索引的最左前缀列。
mysql中索引是在存储引擎层而不是服务器层实现的
B-Tree索引
B-Tree通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。
图中根节点没有画出来。
B-Tree对索引列是顺序组织存储的,索引很适合查找范围数据。
B-Tree索引的限制
如果不是按照索引的最左列开始查找,则无法使用索引。
不能跳过索引中的列
如果查询中有某列的范围查询,则其右边所有列都无法使用索引优化查询。
这些限制都和索引列的顺序存储有关系。或者说是索引顺序存储导致了这些限制。
哈希索引(hash index)
哈希索引基于哈希表实现的,只有精确匹配索引所有列的查询才有效。
对于每一行数据,存储引擎都会对所有的索引列计算一个哈希值(hash code),哈希值是一个较小的值,并且不同键值的行
计算出来的哈希值不一样。哈希索引将所有的哈希值存储在索引中,同时保存指向每个数据行的指针,这样就可以根据,索引
中寻找对于哈希值,然后在根据对应指针,返回到数据行。
mysql中只有memory引擎显式支持哈希索引,innodb是隐式支持哈希索引的。
哈希索引限制:
哈希索引只包含哈希值和行指针,不存储字段值,所以不能使用"覆盖索引"的优化方式,去避免读取数据表。
哈希索引数据并不是按照索引值顺序存储的,索引也就无法用于排序
哈希索引页不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容计算哈希值的。
哈希索引只支持等值比较查询,包括=,in(),<=>,不支持任何范围查询。列入where price>100
访问哈希索引的数据非常快,除非有很多哈希冲突(不同的索引列值却有相同的哈希值)
如果哈希冲突很多的话,一些索引维护操作的代价也会很高。
因为这些限制,哈希索引只适用于某些特定的场合。而一旦适合哈希索引,则它带来的性能提升将非常显著。
innodb引擎有一个特殊的功能“自适应哈希索引”,当innodb注意到一些索引值被使用的非常频繁时,且符合哈希特点(如每次
查询的列都一样),它会在内存中基于B-Tree索引之上再创建一个哈希索引。这是一个完全自动的,内部行为。
创建自定义哈希索引,像模拟innodb一样创建哈希索引。
例如只需要很小的索引就可以为超长的键创建索引。
思路:在B-Tree基础上创建一个伪哈希索引。这和真正的哈希索引不是一回事,因为还是使用B-Tree进行查找,但是它使用
哈希值而不是键本身进行索引查找。需要做的就是在查询的where 子句中手动指定使用哈希函数。
例子:
如果需要存储大量的url,并需要根据url进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会很大,因为URL本身都
很长。正常情况下会有如下查询:
mysql> select id from url where url='http://www.mysql.com';
若删除原来url列上的索引,而新增一个被索引的url_crc列,使用crc32做哈希。就可以实现一个伪哈希索引;查询就变成下面
的方式:
mysql> select id from url where url='http://www.mysql.com'
-> and url_crc=crc32("http://www.mysql.com");
这样性能会提高很多。
当然这样实现的缺陷是需要维护哈希值,就是url改变对应哈希值也应该改变。可以手动维护,当然最好是使用触发器实现。
创建URL表
create table URL (
id int unsigned NOT NULL auto_increment,
url varchar(255) NOT NULL,
url_crc int unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (id),
KEY (url_crc)
);
创建触发器:
delimiter //
create trigger url_hash_crc_ins before insert on URL FOR EACH ROW
BEGIN
SET NEW.url_crc=crc32(NEW.url);
END;
//
CREATE TRIGGER url_hash_crc_upd BEFORE UPDATE ON URL
FOR EACH ROW BEGIN
SET NEW.url_crc=crc32(NEW.url);
END;
//
delimiter ;
mysql> select * from URL;
+----+-----------------------+------------+
| id | url | url_crc |
+----+-----------------------+------------+
| 1 | htttp://www.mysql.com | 1727608869 |
+----+-----------------------+------------+
1 row in set (0.00 sec)
mysql> insert into URL(url) values('htttp://www.');
Query OK, 1 row affected (0.00 sec)
mysql> select * from URL;
+----+-----------------------+------------+
| id | url | url_crc |
+----+-----------------------+------------+
| 1 | htttp://www.mysql.com | 1727608869 |
| 2 | htttp://www. | 1196108391 |
+----+-----------------------+------------+
2 rows in set (0.00 sec)
mysql> UPDATE URL SET url='http://www.baidu.com' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from URL;
+----+-----------------------+------------+
| id | url | url_crc |
+----+-----------------------+------------+
| 1 | htttp://www.mysql.com | 1727608869 |
| 2 | http://www.baidu.com | 3500265894 |
+----+-----------------------+------------+
2 rows in set (0.00 sec)
如果采用这种方式,不要使用SHA1()和MD5()作为哈希函数,应该这个函数计算出来的哈希值是非常长的字符串,会浪费大量
空间,比较时页回更慢。
而如果数据表非常大,crc32()会出现大量的哈希冲突,而解决哈希冲突,可以在查询中增加url本身,进行进一步排除;
如下面查询就可以解决哈希冲突的问题:
mysql> select id from url where url='http://www.mysql.com'
-> and url_crc=crc32("http://www.mysql.com");
空间数据索引(R-Tree)
myisam 表支持空间索引,可以用作地理数据存储。
全文索引
全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。第7章中会详细介绍
索引的优点
剩余19页未读,继续阅读
资源评论
weixin_38637805
- 粉丝: 4
- 资源: 952
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Delphi 12 控件之ArtSQL-Win&Linux-0.1.29.rar
- 基于ssh医药管理系统论文.doc
- Delphi 12 控件之TmsAuth.7z
- 栈板托板堆叠叠盘机(实际投产)sw16可编辑全套技术资料100%好用.zip
- 基于javaweb的二手车管理系统.doc
- pythonProject.zip
- 基于javaweb的SSH家教管理系统论文.doc
- Delphi 12 控件之Dism++10.1.1002.1B.zip
- 基于web的客户关系管理系统论文.doc
- 基于web的车辆维修管理平台的设计与实现.doc
- 基于SSM的动漫网站管理系统.doc
- 基于java的网上演唱会票务系统.doc
- 自动剥料贴标组装循环线(sw18可编辑+工程图)全套技术资料100%好用.zip
- Qt6的QML电子书 官网上下载下来的
- 基于web的在线问答系统论文.doc
- delphi 12 控件之emed64-24.5.2-portable.7z
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功