SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

什么是索引

索引是一种特殊的查询表,可以被数据库搜索引擎用来加速数据的检索。简单说来,索引就是指向表中数据的指针。数据库的索引同书籍后面的索引非常相像。

例如,如果想要查阅一本书中与某个特定主题相关的所有页面,你会先去查询索引(索引按照字母表顺序列出了所有主题),然后从索引中找到一页或者多页与该主题相关的页面。

索引的作用

索引能够提高 SELECT 查询和 WHERE 子句的速度,但是却降低了包含 UPDATE 语句或 INSERT 语句的数据输入过程的速度。索引的创建与删除不会对表中的数据产生影响。

创建索引需要使用 CREATE INDEX 语句,该语句允许对索引命名,指定要创建索引的表以及对哪些列进行索引,还可以指定索引按照升序或者降序排列。

同 UNIQUE 约束一样,索引可以是唯一的。这种情况下,索引会阻止列中(或者列的组合,其中某些列有索引)出现重复的条目。

CREATE INDEX 命令
CREATE INDEX命令的基本语法如下:

CREATE INDEX index_name ON table_name;

单列索引:
单列索引基于单一的字段创建,其基本语法如下所示:

CREATE INDEX index_name ON

table_name (column_name);

以表"Customers"为例,我们想在"城市"列上面建一个索引,可以这样写:

CREATE INDEX index_城市 ONCustomers (城市);

我们看一下我们建好的索引。

唯一索引
唯一索引不止用于提升查询性能,还用于保证数据完整性。唯一索引不允许向表中插入任何重复值。其基本语法如下所示:

CREATE UNIQUE INDEX index_name ON

table_name (column_name);

我们还是以"Customers"表为例,在"客户ID"这一列上建立一个唯一索引

CREATE UNIQUE INDEX index_客户ID ONCustomers (客户ID);

我们看一下建好的唯一索引

聚簇索引
聚簇索引在表中两个或更多的列的基础上建立。其基本语法如下所示:

CREATE INDEX index_name ON

table_name (column1, column2);

我们在表"Customers"上建立一个列"城市"和"省份"的聚簇索引

CREATE INDEX index_城市省份 ONCustomers (城市, 省份);

结果如下:

创建单列索引还是聚簇索引,要看每次查询中,哪些列在作为过滤条件的 WHERE 子句中最常出现。

如果只需要一列,那么就应当创建单列索引。如果作为过滤条件的 WHERE 子句用到了两个或者更多的列,那么聚簇索引就是最好的选择。

隐式索引
隐式索引由数据库服务器在创建某些对象的时候自动生成。例如,对于主键约束和唯一约束,数据库服务器就会自动创建索引。

删除索引
索引可以用 DROP 命令删除。删除索引时应当特别小心,数据库的性能可能会因此而降低或者提高。

其基本语法如下:

DROP INDEX index_name ON table_name;

我们将上面在表"Customers"建立的几个索引一一删除

DROP INDEX index_城市 ON Customers;DROP INDEX index_城市省份 ON Customers;DROP INDEX index_客户ID ON Customers;

我们在看一下结果

证明索引已经全部被删除掉了

什么时候应当避免使用索引
尽管创建索引的目的是提升数据库的性能,但是还是有一些情况应当避免使用索引。下面几条指导原则给出了何时应当重新考虑是否使用索引:

  • 小的数据表不应当使用索引;

  • 需要频繁进行大批量的更新或者插入操作的表;

  • 如果列中包含大数或者 NULL 值,不宜创建索引;

  • 频繁操作的列不宜创建索引。

批注

索引在查询优化中有很大的作用,在约束上也有一定的作用,如能熟练使用索引,对今后处理比较复杂的查询语句会大有裨益。当然也要注意什么时候该使用索引,切不可盲目的使用索引。

©著作权归作者所有:来自51CTO博客作者mb5fd8698f60f87的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Kubernetes中部署MySQL高可用集群
  2. 小技巧 | 如何在SQL Server中快速创建测试数据?
  3. 3.14 为vCenter Server服务器添加外部DSN连接
  4. kubernetes中其他控制器之PodSecurityPolicy
  5. kubernetes常用控制器之StatefulSet
  6. boost项目复盘(二)
  7. 在kubernetes中用Glusterfs做持久化存储
  8. kubernetes中用NFS做后端存储支不支持PVC扩容?
  9. MySQL常用的查询操作

随机推荐

  1. 在数组中计数,其中值为0
  2. 如何添加动态参数
  3. 数据库布局更新是否仍在Magento中使用?
  4. PHP调用存储过程失败(没有执行到)--mysql_e
  5. 在php中检测浏览器,版本和平台的可靠方法
  6. 如何知道php zip扩展程序是否已安装?如何
  7. 从mysql中选择加密密码
  8. 《PHP高级知识进阶》系列技术文章整理收
  9. [CI]CodeIgniter视图 & 模型 & 控制器
  10. 不使用PHP框架的原因?