当向表中插入一行数据时,数据库服务器不会试图将数据放到表中的特定位置。因此当查询时,服务器需要通过检查表中的每一行来完成查询。
当表中的数据过大时,服务器不能在合适的时间内完成查询,但是可以通过建立一个或多个索引来完成。
> ALTER TABLE department ADD INDEX dept_name_idx (name);
这个语句为department.name创建了索引,并将该索引命名为dept_name_idx。
> SHOW INDEX FROM department
查看表中的所有索引
当表被创建时,服务器会自动为主键列生成索引,生成索引名为PRIMARY。
> ALTER TABLE department DROP INDEX dept_name_idx;
索引可以有以下作用:
- 提供常规索引
- 作为一种机制限制索引列出现重复值。
索引类型
不同类型的数据需要不同的索引策略。
B树索引
B树索引以树结构组织,它又一个或多个分支节点,分支节点指向单级的叶节点,分支节点用于遍历树,叶节点则保存真正的值和位置信息。
当向表中插入、更新和删除数据时,服务器会尽力保持树的平衡。通过保持树的平衡,不需要遍历多层分支节点,服务器就能快速地到达叶节点查找到需要的值。
位图索引
虽然B树索引擅长于处理包含许多不同值的列(比如客户的姓氏/姓名),但是在处理允许少量不同值的列是会变得很难用。
总共有8类产品,有些产品会越来乐手欢迎,客户数目的增长会使得B树索引很难继续维持平衡。
对于那些包含少量值却占据了大量行的列,可以使用位图索引。有点类似于One-Hot编码。
位图索引通常用于数据仓库,需哟啊大量的数据被索引,但是每个列却只包含相对少的值。
文本索引
当数据库中存储文档,那么可能需要语序用户在文档中查找单词或者查找短语。但是又不希望每次请求搜素服务器都打开每个文档,然后扫描需要的文档。这时候就使用文本索引。
如何使用索引
服务器通常先使用索引快速定位特定表中的行,之后再访问相关表提取用户请求的补充信息。如果索引包含满足查询的所有内容,那么服务器就不必访问相关的表了。
索引的不足
每个索引事实上都是一个表(一种特殊的表),每次对表添加或者删除行时,表中的所有索引必须修改,当更新行时,收到影响的列的任何索引也必须被修改。因此索引越多,服务器级需要多越多的工作来保持所有模式对象最新。
仅当出现清晰需求时才添加索引,运行程序,删除索引,下次需要时再重复一遍。
网友评论