精华内容
下载资源
问答
  • mysql创建组合索引

    千次阅读 2017-02-21 15:52:27
    正例: where a=? and b=? order by c; 索引: a_b_c 反例: 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引 a_b 无法排序。
    正例: where a=?
    and b=?
    order by c; 索引:
    a_b_c
    反例: 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引
    a_b 无法排序。
    展开全文
  • 数据库版本:mysql5.7 索引类型:组合索引 ...原因:组合索引的字段长度超过mysql 的最大限制 mysql数据库对于不同的存储引擎下的单表索引长度限制: innodb下单表索引最大长度797bytes,myi...

    数据库版本:mysql5.7

    索引类型:组合索引

    存储引擎:innodb

    字符集:utf-8

    报错:Specified key ‘索引名’ was too long; max key length is 767 byte

    原因:组合索引的字段长度超过mysql 的最大限制

    mysql数据库对于不同的存储引擎下的单表索引长度限制:

    innodb下单表索引最大长度797bytes,myisam最大长度为1000bytes。

    由于数据库使用的是utf-8编码,一个字符等于3个字节,换算后innodb表(utf-8下)索引字段最大长度为255,myisam表(utf-8)索引字段长度最大为333。

    解决办法:将组合索引拆分为单个索引。

    展开全文
  • 组合索引,也就是表中的某几列数据组合起来,结果要是唯一的。 具体语法为: CREATE UNIQUE INDEX index ON table( col1, col2, col3 ) ; table为表名,括号里为字段名 需注意:varchar字段不能太长,太长会报错 ...

    组合索引,也就是表中的某几列数据组合起来,结果要是唯一的。
    具体语法为:

    CREATE UNIQUE INDEX index ON table( col1, col2, col3 ) ;
    
         table为表名,括号里为字段名	
         需注意:varchar字段不能太长,太长会报错
         创建的索引长度是有限制的,不能超过767
    
    展开全文
  • Mysql创建索引

    2020-12-17 16:32:48
    Mysql创建索引 表名称 js_new_shareholderinfo 创建的索引名称(自定义):IDX_wybs 要创建的索引字段名:wybs ALTER TABLE js_new_shareholderinfo ADD INDEX IDX_wybs ( wybs ) ; 经过测试加了普通索引是原sql的...

    Mysql创建表索引

    表名称 js_new_shareholderinfo
    创建的索引名称(自定义):IDX_wybs
    要创建的索引字段名:wybs
    ALTER TABLE js_new_shareholderinfo ADD INDEX IDX_wybs ( wybs ) ;
    经过测试加了普通索引是原sql的十倍以上

    mysql索引:四种类型,两种方法

    1. 普通索引:最基本的索引,它没有任何限制,用于加速查询。

    2. 唯一索引unique:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    3. 主键索引: 是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

    4. 空间索引Spatial :空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

    5. 全文索引fulltext: 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
    可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

    (1)Hash 索引仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询。

    由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

    (2)Hash 索引无法被用来避免数据的排序操作。

    由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

    (3)Hash 索引不能利用部分索引键查询。

    对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

    (4)Hash 索引在任何时候都不能避免表扫描。

    前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

    (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

    对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下

    1. B-Tree索引
      B-Tree 索引是 MySQL 数据库中使用最为频繁的索引类型,除了 Archive 存储引擎之外的其他所有的存储引擎都支持 B-Tree 索引。不仅仅在 MySQL 中是如此,实际上在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检 索中有非常优异的表现。 一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf Node ,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,所以我们大家都称之为 B-Tree 索引当然,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际上是 B+Tree ,也就是在 B-Tree 数据结构的基础上做了很小的改造,在每一个 Leaf Node 上面出了存放索引键的相关信息之外,还存储了指向与该 Leaf Node 相邻的后一个 LeafNode 的指针信息,这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。 在 Innodb 存储引擎中,存在两种不同形式的索引,一种是 Cluster 形式的主键索引( Primary Key ),另外一种则是和其他存储引擎(如 MyISAM 存储引擎)存放形式基本相同的普通 B-Tree 索引,这种索引在 Innodb 存储引擎中被称为 Secondary Index 。下面我们通过图示来针对这两种索引的存放 形式做一个比较。

      图示中左边为 Clustered 形式存放的 Primary Key ,右侧则为普通的 B-Tree 索引。两种 Root Node 和 Branch Nodes 方面都还是完全一样的。而 Leaf Nodes 就出现差异了。在 Prim中, Leaf Nodes 存放的是表的实际数据,不仅仅包括主键字段的数据,还包括其他字段的数据据以主键值有序的排列。而 Secondary Index 则和其他普通的 B-Tree 索引没有太大的差异,Leaf Nodes 出了存放索引键 的相关信息外,还存放了 Innodb 的主键值。
      所以,在 Innodb 中如果通过主键来访问数据效率是非常高的,而如果是通过 Secondary Index 来访问数据的话, Innodb 首先通过 Secondary Index 的相关信息,通过相应的索引键检索到 Leaf Node之后,需要再通过 Leaf Node 中存放的主键值再通过主键索引来获取相应的数据行。MyISAM 存储引擎的主键索引和非主键索引差别很小,只不过是主键索引的索引键是一个唯一且非空 的键而已。而且 MyISAM 存储引擎的索引和 Innodb 的 Secondary Index 的存储结构也基本相同,主要的区别只是 MyISAM 存储引擎在 Leaf Nodes 上面出了存放索引键信息之外,再存放能直接定位到 MyISAM 数据文件中相应的数据行的信息(如 Row Number ),但并不会存放主键的键值信息
      索引是数据库中用来提高性能的最常用工具。所有MySql列类型都可以被索引。索引用于快速找出在某个列中有一特定值的行。如果不使用索引,MYSQL必须从第一条记录开始然后读完整个表直到找出相关的行。常用的包括BTREE索引和HASH索引。

    创建的语句:

    CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type]
    on tbl_nam(index_col_name,……)
    1
    2
    3
    1
    2
    3
    删除索引语句:

    DROP INDEX index_name ON tbl_name
    1
    2
    1
    2
    设计索引的规则:

    最适合索引的列是出现在where子句中的列,或连接子句中指定的列,而不是出现在select关键字后的选择列表中的列。
    索引的列的基数越大,索引的效果越好。
    尽量使用短索引。能够节省大量索引空间,也可能使查询更快。
    不要过度索引。索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构。
    BTREE索引和HASH索引的比较
    1、B-Tree索引

    索引存储的值按索引列中的顺序排列。可以用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。如果使用索引,必须保证按索引最左边前缀进行查询。由于B树中节点是顺序存储的,可以对查询结果进行order by。

    限制:

    1)查询必须从索引的最左边的列开始

    2)不能跳过某一索引列。

    3)存储引擎不能使用索引中范围条件右边的列。

    例如,如果你的查询语句为WHERE last_name=”Smith” AND first_name LIKE ‘J%’ AND dob=’1976-12-23’,则该查询只会使用索引中的前两列,因为LIKE是范围查询。

    2、Hash索引
    MySQL中只有Memory存储引擎显示支持hash索引,是默认索引类型,它也支持B-Tree索引。

    如果多个值有相同的hash code,索引把它们的行指针用链表保存到同一个hash表项中。
    因为索引自己仅仅存储很短的值,所以索引非常紧凑,hash值不取决于列的数据类型,
    int列的索引和长字符串列的索引一样大。

    3、总结

    HASH索引适合等式比较的操作,不能用来加速order by操作,也不能确定在两个值之间大约有多少行,会影响一些查询的执行效率。而且只能使用整个关键字来搜索一行。
    BTREE索引,使用大于,小于,BETWEEN,不等于,LIKE等操作符的时候都可以用。对索引字段进行范围查询的时候,只有BTREE索引可以通过索引访问。HASH索引实际上是全表扫描的。
    如果对多列进行索引,列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效查找。

    假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够
    使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。
    但是,查询语句select * from t1 where c2=2不能够使用该索引,
    因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

    索引是在存储引擎中实现的,不是在服务器层中实现的。所以,每种存储引擎的索引都不
    一定完全相同,并不是所有的存储引擎都支持所有的索引类型。

    高性能索引策略
    1、聚簇索引
    聚簇索引保证关键字的值相近的元组存储的物理位置也相同(所以字符串类型不宜建立聚簇索引,
    特别是随机字符串,会使得系统进行大量的移动操作),且一个表只能有一个聚簇索引。
    因为由存储引擎实现索引,所以,并不是所有的引擎都支持聚簇索引。
    目前,只有solidDB和InnoDB支持。

    2、覆盖索引

    索引的使用
    1)索引不会包含有null值得列

    2)尽量使用短索引,对串列进行索引,如果可能应该指定一个前缀长度。短索引不仅可以提高查询速度而且可以节省磁盘空间和IO操作

    3)like语句操作:like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

    4)不要在列上进行运算
    例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。

    使用限制:
    1)由于索引仅包含hash code和记录指针,所以,MySQL不能通过使用索引避免读取记录。但是访问内存中的记录是非常迅速的,不会对性能造成太大影响

    2)不能使用hash索引排序。

    3)Hash索引不支持键的部分匹配,因为是通过整个索引值来计算hash值的。

    4)Hash索引只支持等值比较,例如使用=,IN( )和<=>。对于WHERE price>100并不能加速查询。

    原文链接:https://blog.csdn.net/lovezhaohaimig/article/details/80303613

    展开全文
  • MySQL 创建索引

    2019-04-30 15:36:36
    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以...单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引组合索引,即一个索引包含多个列。 创建索引时,你需要...
  • MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。  为了形象地对比两者,再建一个表: ...
  • 单列索引: 只有一个字段...创建 Index(a, b, c) 组合索引 ,相当于创建了(a)单列索引、(a, b)联合索引以及(a, b, c)联合索引。当where中的顺序只有是这三个顺序时, 才能使用索引。 1. 组合索引查询 查询( ...
  • mysql索引和组合索引

    2018-08-21 11:26:39
    1、索引分为单列索引和组合索引 单列索引:   创建:CREATE INDEX 索引名 ON `表名`(`字段名`) 删除:DROP INDEX 索引名 ON `表名` 组合索引 创建:CREATE INDEX 索引名 ON `表名`(`字段名1`,`字段名2`...
  • 创建表的时候对经常要查询的列添加索引或者组合索引 索引直接影响后面的查询性能,尤其是数据量越大的时候,影响越明显。作为一个从事DBA生涯超过5年的DBA,遇到过无数次由于没有添加索引,导致的线上故障,请各位...
  • MySQL中的组合索引

    2020-11-17 19:06:22
    使用表中的name,address,salary创建组合索引,那么想要组合索引生效, 我们只能使用如下组合; Name/address/salary Name/address Name 如果使用address/salary或者是salary则索引不会生效; 二、如果添加组合...
  • MySQL 索引✈一、索引的概念✈二、索引的作用✈三、创建索引的原则依据✈四、索引的分类和创建✈1、普通索引(最基本的索引类型)✈2、唯一索引✈3、主键索引✈4、组合索引(单列索引与多列索引)✈5、全文索引...
  • 创建组合索引时,网上一般的说法会提到:查询时where条件中的列的顺序要和创建索引时列的顺序保持一致,否则组合索引会失效。 更进一步来说,组合索引的各个列中,到底谁应该在前,谁应该在后,还是说创建时顺序...
  • 单列索引,组合索引 http://www.runoob.com/mysql/mysql-index.html 索引分单列索引和组合索引。 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引组合索引,即一个索引包含多个列...
  • MySQL索引创建与使用

    万次阅读 多人点赞 2018-08-06 18:49:59
    声明:本人主要简单示例MySQL中的单列索引、组合索引创建与使用。 索引的创建: 建表时创建: CREATE TABLE 表名( 字段名 数据类型 [完整性约束条件], ……, [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY ...
  • 这是在创建表的同时创建组合索引,并且添加了索引长度100,然后提示 ERROR 1089 (HY000): Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the ...
  • 什么时候创建组合索引? 当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引 为什么不对没一列创建索引 减少开销 覆盖索引 效率高 减少开销:假如对col1、col2、col3创建组合索引,相当...
  • mysql组合索引,abc索引命中

    千次阅读 2020-09-23 15:28:29
    mysql联合索引,abc的争议实践 原因: 在一次和同事讨论mysql联合索引的面试题时出现了争议。主要问题是:a、b、c三个字段作为联合索引,b、c;和a、c情况到底会不会命中索引? 网上查阅相关博客发现很多答案不一样...
  • mysql组合索引与字段顺序 下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,...
  • 文章目录概述普通索引唯一索引主键索引组合索引最左前缀 概述 索引分单列索引和组合索引: 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引组合索引(也叫复合索引),即一个...
  • 环境:mysql-5.5.36测试表:组合索引idx_id_name(`id`,`name`)1.1 过滤条件不是索引前缀且查询列...再过滤出符合的id1.3过滤条件是索引前缀且查询列在索引中:使用索引创建组合索引一定要考虑查询的频率和顺序。 ...
  • 转自:...很多时候,我们在mysql创建了索引,但是某些查询还是很慢,根本就没有使用到索引! 一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中...
  • Mysql组合索引使用和用法

    万次阅读 2018-12-31 17:30:51
    一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符。 看下面的例子: 假设有一张订单表(orders),包含order_id和product_id二个字段。 一共有31条数据...
  • 创建MySQL索引

    2018-09-21 20:54:49
    简介: 索引是对数据库表中一列或多列的值进行排序的一种表...普通索引、唯一索引、单列索引、组合索引、全文索引、空间索引 设计索引的原则: 索引的数量要适当,不是越多越好;数据量小的表最好不要使用索引,...
  • 创建组合索引 创建全文索引 创建控件索引 删除索引 为表格创建索引 选择表格,右键、设计 点击索引,输入索引名,选择要添加索引的字段,索引类型、索引数据结构 以下是创建简单的普通单列索引 以下是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 975
精华内容 390
关键字:

mysql创建组合索引

mysql 订阅