返回顶部
首页 > 资讯 > 数据库 >细说mysql索引
  • 950
分享到

细说mysql索引

细说mysql索引 2016-11-18 10:11:05 950人浏览 猪猪侠
摘要

https://www.cnblogs.com/chenshishuo/p/5030029.html   本文从如何建立Mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先

细说mysql索引

https://www.cnblogs.com/chenshishuo/p/5030029.html

 

本文从如何建立Mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方

首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname="CSS",如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE nickname = "css"

一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname="css"的数据,是不是感觉性能提升了好多咧....

mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引.

单列索引:一个索引只包含一个列,一个表可以有多个单列索引.

组合索引:一个组合索引包含两个或两个以上的列,

本文使用的案例的表

复制代码
CREATE TABLE `award` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT "用户id",
   `aty_id` varchar(100) NOT NULL DEFAULT "" COMMENT "活动场景id",
   `nickname` varchar(12) NOT NULL DEFAULT "" COMMENT "用户昵称",
   `is_awarded` tinyint(1) NOT NULL DEFAULT 0 COMMENT "用户是否领奖",
   `award_time` int(11) NOT NULL DEFAULT 0 COMMENT "领奖时间",
   `account` varchar(12) NOT NULL DEFAULT "" COMMENT "帐号",
   `passWord` char(32) NOT NULL DEFAULT "" COMMENT "密码",
   `message` varchar(255) NOT NULL DEFAULT "" COMMENT "获奖信息",
   `created_time` int(11) NOT NULL DEFAULT 0 COMMENT "创建时间",
   `updated_time` int(11) NOT NULL DEFAULT 0 COMMENT "更新时间",
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT="获奖信息表";
复制代码

(一)索引的创建

单列索引

1-1)    普通索引,这个是最基本的索引,

其sql格式是 CREATE INDEX IndexName ON `TableName`(`字段名`(length)) 或者 ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

第一种方式 :

  CREATE INDEX account_Index ON `award`(`account`);

第二种方式: 

ALTER TABLE award ADD INDEX account_Index(`account`)

 

 

 

如果是CHAR,VARCHAR,类型,length可以小于字段的实际长度,如果是BLOB和TEXT类型就必须指定长度,

1-2)    唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值,

其sql格式是 CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length)); 或者 ALTER TABLE TableName ADD UNIQUE (column_list)  

CREATE UNIQUE INDEX account_UNIQUE_Index ON `award`(`account`);

1-3)    主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)

主键索引建立的规则是 int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的

 

组合索引

一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称

其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

 CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);

 

如果你建立了 组合索引(nickname_account_createdTime_Index) 那么他实际包含的是3个索引 (nickname) (nickname,account)(nickname,account,created_time)

在使用查询的时候遵循mysql组合索引的"最左前缀",下面我们来分析一下 什么是最左前缀:及索引where时的条件要按照建立索引的时候字段的排序方式

1、不按索引最左列开始查询(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where `c2` = `aaa` and `c3`=`sss` 不能使用索引

2、查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)

Where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 改查询只会使用索引中的前两列,因为like是范围查询

3、不能跳过某个字段来进行查询,这样利用不到索引,比如我的sql 是 

explain select * from `award` where nickname > "rSUQFzpkDz3R" and account = "DYxJoqZq2rd7" and created_time = 1449567822; 那么这时候他使用不到其组合索引.

因为我的索引是 (nickname, account, created_time),如果第一个字段出现 范围符号的查找,那么将不会用到索引,如果我是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引是(nickname),

因为上面说了建立组合索引(nickname, account, created_time), 会出现三个索引

 

(3)全文索引

文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定.

如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column lick "%xxxx%" 这样做会让索引失效

.这个时候全文索引就祈祷了作用了

ALTER TABLE tablename ADD FULLTEXT(column1, column2)

有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。

ELECT * FROM tablename
WHERE MATCH(column1, column2) AGaiNST(‘xxx′, ‘sss′, ‘DDD′)

这条命令将把column1和column2字段里有xxx、sss和ddd的数据记录全部查询出来。

 

(二)索引的删除

删除索引的mysql格式 :DORP INDEX IndexName ON `TableName`

 

(三)使用索引的优点

可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
2.建立索引可以大大提高检索的数据,以及减少表的检索行数
3.在表连接的连接条件 可以加速表与表直接的相连
4.在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
5.建立索引,在查询中使用索引 可以提高性能

 

(四)使用索引的缺点

在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。

(五)使用索引需要注意的地方

在建立索引的时候应该考虑索引应该建立在数据库表中的某些列上面 哪一些索引需要建立,哪一些所以是多余的.
一般来说,
1.在经常需要搜索的列上,可以加快索引的速度
2.主键列上可以确保列的唯一性
3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间,  (单独order by 用不了索引,索引考虑加where 或加limit)
5.在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)

like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick "%ABC%" 那么这个索引讲不会起到作用.而nickname lick "ABC%" 那么将可以用到索引

索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 " "字符串

使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.

不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描

选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快

(六)什么情况下不创建索引

查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
3.定义为text和image和bit数据类型的列不应该增加索引,
4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系

您可能感兴趣的文档:

--结束END--

本文标题: 细说mysql索引

本文链接: https://lsjlt.com/news/5718.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 细说mysql索引
    https://www.cnblogs.com/chenshishuo/p/5030029.html   本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先...
    99+
    2016-11-18
    细说mysql索引
  • MySQL索引详细解析
    目录1. mysql 索引的最左前缀原则2. 前缀索引3. 索引下推(ICP——Index Condition Pushdown)4. 查看 MySQL 语句是否用到索引5. 为什么官方建议用自增...
    99+
    2024-04-02
  • MySQL索引下推详细
    目录1、最左前缀原则2、回表3、索引下推前言: 索引下推(ICP)是针对MySQL使用索引从表中检索数据行的情况的优 在没有索引下推的情况下,MySQL通过存储引擎遍历索...
    99+
    2024-04-02
  • mysql索引的详细知识
    下面讲讲关于mysql索引的详细知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完mysql索引的详细知识这篇文章你一定会有所受益。      &...
    99+
    2024-04-02
  • MySQL索引的详细介绍
    这篇文章主要介绍MySQL索引的详细介绍,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是索引?  在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的...
    99+
    2024-04-02
  • mysql索引合并的说明和使用
    本篇内容介绍了“mysql索引合并的说明和使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是索引合并...
    99+
    2024-04-02
  • MySQL索引结构详细解析
    目录简介索引结构(树)为什么用树,而不用哈希表BTree索引B+Tree索引聚簇索引与非聚簇索引索引分类性能分析索引创建场景简介 在数据之外,数据库系统还维护着满足特定查找算法的数据...
    99+
    2024-04-02
  • MySQL中的索引index(超详细)
    概念: 在MySQL中,索引(index)是一种特殊的数据结构,它能够加快数据库中数据的检索速度。索引可以看做是一本书的目录,它提供了一种快速查找数据的方式。 MySQL中的索引是建立在一张表的一列或多列上的,用于加快对表中数据的查找速度...
    99+
    2023-09-02
    mysql 数据库
  • MySQL索引事务详细解析
    目录一、索引 1.概念2.作用3.缺陷4.使用场景5.使用1.查看索引2.创建索引3.删除索引6.案例二、事务1.为什么使用事务2.事务的概念3.使用4.特性一、索引 1.概念 索...
    99+
    2024-04-02
  • MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引详细介绍
    目录一、索引类型二、聚簇索引和非聚簇索引三、覆盖索引四、联合索引最左前缀匹配原则索引下推五、唯一索引一、索引类型 索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性...
    99+
    2023-04-19
    MySQL索引 MySQL聚簇索引 MySQL非聚簇索引 MySQL联合索引 MySQL唯一索引
  • MySQL 索引的一些细节分享
    前几天同事问了我个 mysql 索引的问题,虽然大概知道,但是还是想来实践下,就是 is null,is not null 这类查询是否能用索引,可能之前有些网上的文章说都是不能用索引,但是其实不是,我们来看个小试验...
    99+
    2022-05-30
    MySQL 索引 MySQL 索引细节
  • MySQL Innodb索引机制详细介绍
    1、什么是索引 索引是存储引擎用于快速找到记录的一种数据结构。 2、索引有哪些数据结构 顺序查找结构:这种查找效率很低,复杂度为O(n)。大数据量的时候查询效率很低。 ...
    99+
    2024-04-02
  • MySQL索引:B+树索引
    MySQL索引:B+树索引 B+树索引是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。B+树索引的构造类似于二叉树,根据键值快速找到数据 B树 B+树是由B树演化而来的,在了解B+树之前,我们需要对B树有一点认...
    99+
    2021-09-01
    MySQL索引:B+树索引
  • MySQL索引优化之分页探索详细介绍
    目录​​MySQL​​索引优化之分页探索案例一案例二​​MySQL​​索引优化之分页探索 表结构 CREATE TABLE `demo` ( `id` int(11) NOT...
    99+
    2024-04-02
  • mysql索引创建和使用细节(一)
    最近困扰自己很久的膝盖积液手术终于做完,在家养伤,逛技术博客看到easyswoole开发组成员仙士可博客有关mysql索引方面的知识,自己打算重温下。 正常业务起步数据表数据量较少,不用考虑使用索引,当后期累积的数据数量非常可观时...
    99+
    2016-01-16
    mysql索引创建和使用细节(一)
  • MySQL数据库索引的详细介绍
    这篇文章主要讲解了“MySQL数据库索引的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库索引的详细介绍”吧!01、前言看了很多关于索...
    99+
    2024-04-02
  • 【MySQL进阶教程】 索引详细介绍
    前言 本文为 【MySQL进阶教程】 索引 相关知识介绍,下边具体将对索引概述,索引结构(包括:索引结构概述,二叉树,B-Tree,B+Tree,Hash),索引分类,索引语法(包括:创建索引,查看...
    99+
    2023-10-03
    mysql java 数据库
  • mysql数据库之索引详细介绍
    目录思维导图简单理解索引模型的演变二叉查找树自平衡二叉树B树B+树聚集索引与二级索引总结 如果你想深入了解为什么mysql可以快速的进行检索数据,那么你一定要来了解一下mysql的索...
    99+
    2024-04-02
  • mysql索引(覆盖索引,联合索引,索引下推)
    目录什么是索引?索引的实现方式innodb的索引模型索引维护覆盖索引联合索引索引下推什么是索引? 当我们使用汉语字典查找某个字时,我们会先通过拼音目录查到那个字所在的页码,然后直接翻到字典的那一页,找到我们要查的字,通过...
    99+
    2024-04-02
  • [MySQL]MySQL索引
    [MySQL]MySQL索引 文章目录 [MySQL]MySQL索引1. 索引的概念2. 认识磁盘磁盘的内部结构磁盘中的一个盘片结构定位扇区磁盘随机访问与连续访问 3. MySQL与磁盘交互的基本单位4. 建立共识5. 索引的...
    99+
    2023-08-17
    mysql 数据库 linux centos 阿里云
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作