数据库查询优化-添加索引

在数据库中,我们通过创建索引可以大大提高查询的速度,一个好的索引可以另SQL的查询更加效率。而一个错误的索引不仅带不来效率的提高,甚至会带来额外的系统开销

索引的基本操作
创建索引
建表时创建索引

建表的时候指定

CREATE TABLE user(
       ID INT NOT NULL, 
       username VARCHAR(16) NOT NULL, 
       INDEX [indexName] (username(length))
);
1
2
3
4
5
CREATE创建索引

为已有的表添加

CREATE INDEX indexName ON user(username(length));
1
主键索引

该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL

ALTER TABLE user ADD PRIMARY KEY (ID)
1
唯一索引

这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)

ALTER TABLE user ADD UNIQUE indexName (username)
1
普通索引

添加普通索引,索引值可出现多次

ALTER TABLE user ADD INDEX indexName (username)
1
全文索引

该语句指定了索引为 FULLTEXT ,用于全文索引。仅可用于 MyISAM 表,
用于在一篇文章中,检索文本信息的。

ALTER TABLE user ADD FULLTEXT indexName (username)
1
联合索引

组合索引(包含多列的索引,与单行索引相对),遵循最左原则

ALTER TABLE user ADD INDEX indexName ( `column1`, `column2`, `column3` )
1
删除索引
DROP INDEX indexName ON user;
1
修改索引
alter TABLE user add INDEX indexName on(username(length))
1
查询索引信息
使用 show index 命令来列出表中的相关的索引信息。可以通过添加 \g 来格式化输出信息。

SHOW INDEX FROM user
1
使用索引
使用索引时候需要注意的

LIKE关键字匹配’%‘开头的字符串,不会使用索引,但是以’%‘结尾的可以。
OR关键字的两个字段必须都是用了索引,该查询才会使用索引。
使用多列索引必须满足最左匹配.
数据库索引的原理
一般来说数据库索引是使用B+tree的数据结构

使用B+树,并不是二叉树而是指的平衡树,它可以根据键值快速找到数据。B+树索引通过键值可以快速定位数据行所在的页,然后数据库通过页内容读入内存,而在内存中定位到数据。

数据库索引可以实现效果

可以避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页。
对于非聚集索引,有时不需要访问数据页即可得到数据。
聚集索引可以避免数据插入操作,集中于表的最后一个数据页面。
在某些情况下,索引可以避免排序操作。
无索引的查询中,没有使用索引的情况下扫描每个记录来查找符合条件的记录。

数据库索引的不足
数据库索引使用了空间换时间的策略,建立的索引会占用磁盘空间。随着数据的增加,索引文件会膨胀很快。
数据库不仅需要保存数据还需要保存索引文件,这就导致对表进行更新或者删除操作的时候速度降低。
索引越多会让数据更新操作的时候变得更慢,不合理的索引会拖慢数据库的整体效率。
创建索引的原则
主键列默认使用了索引
假如有外键定义也需要建立索引
经常被作为查询条件的列最好建立索引
经常需要被排序、分组的字段建立索引,如果是复合索引,则需要排序、分组的顺序和索引顺序一致
极少作为查询条件、或者数据存在大量重复的列不需要建立索引
对于数据较多的字段,最好不要建立索引
经常被修改的字段,最好不要建立索引
多表连接查询的时候,连接字段上应该建立索引
频繁被修改的表,最好不要建立太多的索引
检查索引,删除无用的索引
正确算是创建复合索引
对于复合索引,第一个字段应该是使用频率最高的字段
复合索引中的几个字段,需要经常以AND方式出现在条件语句中,否则不需要创建复合索引
复合索引中的字段不宜过多(3个及以下)
一个字段有单独查询也有关联查询,一般来说创建单独索引而不需要创建复合索引
————————————————
转载:https://blog.csdn.net/qq330983778/article/details/100086830

众览群雄,唯我杭城独秀——一贴汇总杭州校区所有就业薪资

原文地址:https://www.cnblogs.com/zhuxiaopijingjing/p/12262853.html

时间: 2024-10-11 09:32:41

数据库查询优化-添加索引的相关文章

数据库查询优化——Mysql索引

工作一年了,也是第一次使用Mysql的索引.添加了索引之后的速度的提升,让我惊叹不已.隔壁的老员工看到我的大惊小怪,平淡地回了一句"那肯定啊". 对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 小宝鸽试了一下,2.5万数据单表中,无索引:200ms-700ms,添加索引后10ms-15ms,使用redis缓存1ms-7ms,如果数据量更大的时候,索引效果将会更加明显.更甚者,多表查询. 索引原理

数据库表添加索引对性能的影响

1.添加索引后查询速度会变快 mysql中索引是存储引擎层面用于快速查询找到记录的一种数据结构,索引对性能的影响非常重要,特别是表中数据量很大的时候,正确的索引会极大的提高查询效率.简单理解索引,就相当于一本砖头厚书的目录部分,通过目录可以快速查找到想要找的内容具体所在的页码.在经常需要搜索的列上创建索引,可以加快搜索的速度.如果表中数据少的话,没必要用索引,如果表中数据很多的话,还是有索引比较好. 2.索引的优点 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 可以大大加快数据的检

MySQL数据库篇之索引原理与慢查询优化之二

接上篇 7??  正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:>.>=.<.<=.!= .between...and....like. #2 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是

mysql数据库添加索引优化查询效率

项目中如果表中的数据过多的话,会影响查询的效率,那么我们需要想办法优化查询,通常添加索引就是我们的选择之一: 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysql>ALTER TABLE `ta

sql service添加索引

语法:CREATE [索引类型] INDEX 索引名称ON 表名(列名)WITH FILLFACTOR = 填充因子值0~100GO /*实例*/USE 库名GOIF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--检测是否已经存在IX_TEST_TNAME索引DROP INDEX TEST.IX_TEST_TNAME--如果存在则删除 --创建索引CREATE NONCLUSTERED INDEX IX_TEST_TN

MSSQL数据库查询优化(一)

--优化学习(一) 我现有一表Orders,其中包含OrderId,UserId,CreateDate,TotalMoney,OrderType五个字段, 目前没有主键和其他索引 如今我想查询出在指定某个日期的订单数量,并返回OrderId,UserId,TotalMoney三字段,具体 查询语句如下: select OrderId, UserId, TotalMoneyfrom Orderswhere CreateDate='2012-12-17 14:59:53.463' 这个时候我执行以下

数据库:数据库引擎、索引、pymysql(四)

一.数据库存储引擎 1.存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等. 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此

数据库操作--创建索引

前段时间接到个任务,要在两秒内从1000万条数据中查询某一条数据是否存在.着实吓我一跳.1000万条数据!两秒!真的可以么?幸好师傅给指了条明路.可以考虑用表分区来实现.虽然不知道表分区是什么,但是最起码有一个方向了.然后就开始在网上搜索表分区的资料,看了看网上的资料,差不多都是一些建表分区的教程.但是我要建立的表分区和例子上又不一样,需要动态的建立表分区,这就难了.搞了半天没搞好.后来想起来春哥和游哥提到过以前他们在对数据库搜索数据的很慢,然后在数据库中加了索引以后,搜索提升了好几倍. 好,那

Day46:数据库引擎、索引、pymysql

一.数据库存储引擎 1.存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等. 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此