精华内容
下载资源
问答
  • mysql建索引几个原则

    千次阅读 2020-10-20 11:09:10
    唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询...

    1.选择唯一性索引

    唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

    2.为经常需要排序、分组和联合操作的字段建立索引

    经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。

    3.为常作为查询条件的字段建立索引

    如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。

    4.限制索引的数目

    索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

    5.尽量使用数据量少的索引

    如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。

    6.尽量使用前缀来索引

    如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

    7.删除不再使用或者很少使用的索引

    表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

    8 . 最左前缀匹配原则,非常重要的原则。

    mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

    9 .=和in可以乱序。

    比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

    10 . 尽量选择区分度高的列作为索引。

    区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就 是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条 记录

    11 .索引列不能参与计算,保持列“干净”。

    比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本 太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

    12 .尽量的扩展索引,不要新建索引。
    比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

    注意:选择索引的最终目的是为了使查询的速度变快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。读者要在以后的学习和工作中进行不断的实践。根据应用的实际情况进行分析和判断,选择最合适的索引方式。

    参考:http://book.51cto.com/art/201012/240955.htm

    展开全文
  • 一、可以创建个索引嘛? 可以创建个索引的。 需要开发人员根据实际的用途以及数据库中记录的情况,来进行判断。 通常来说,表的索引越多,其查询的速度也就越快。但是,表的insert/update速度则会降低。这主要是...

    一、可以创建多个索引嘛?

    可以创建多个索引的。
    需要开发人员根据实际的用途以及数据库中记录的情况,来进行判断。

    通常来说,表的索引越多,其查询的速度也就越快。但是,表的insert/update速度则会降低。这主要是因为,在更新记录的同时需要更新相关的索引信息。为此,到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得一个均衡点。

    如对于一些数据仓库数据库系统,其主要用来进行查询。相关的记录往往是在数据库初始化的时候倒入。此时,设置的索引多一点,可以提高数据库的查询性能。同时因为记录不怎么更新,所以索引比较多的情况下,也不会影响到更新的速度。即使在起初的时候需要导入大量的数据,此时也可以先将索引禁用掉。等到数据导入完毕后,再启用索引。可以通过这种方式来减少索引对数据更新的影响。

    如果那些表中经常需要更新记录,如一些事务型的应用系统,数据更新操作是家常便饭的事情。此时如果在一张表中建立过多的索引,则会影响到更新的速度。由于更新操作比较频繁,所以对其的负面影响,要比查询效率提升要大的多。此时就需要限制索引的数量,只在一些必要的字段上建立索引。

    二、创建索引

    1.ALTER TABLE

    ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

    ALTER TABLE table_name ADD INDEX index_name (column_list)

    ALTER TABLE table_name ADD UNIQUE (column_list)

    ALTER TABLE table_name ADD PRIMARY KEY (column_list)

    其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

    2.CREATE INDEX

    CREATE INDEX可对表增加普通索引或UNIQUE索引。

    CREATE INDEX index_name ON table_name (column_list)

    CREATE UNIQUE INDEX index_name ON table_name (column_list)

    table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

    三、索引类型

    在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

    PRIMARY KEY索引和UNIQUE索引非常类似。
    事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。

    下面的SQL语句对students表在sid上添加PRIMARY KEY索引。
    ALTER TABLE students ADD PRIMARY KEY (sid)

    四、删除索引

    可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

    DROP INDEX index_name ON talbe_name

    ALTER TABLE table_name DROP INDEX index_name

    ALTER TABLE table_name DROP PRIMARY KEY

    其中,前两条语句是等价的,删除掉table_name中的索引index_name。

    第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

    如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

    五、单一索引和复合索引

    1.单一索引:
    单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;

    2.复合索引:
    复合索引也叫组合索引,用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。

    复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;

    3.使用:

    创建复合索引 :
    CREATE INDEX columnId ON table1(col1,col2,col3) ;

    查询语句:
    select * from table1 where col1= A and col2= B and col3 = C
    这时候查询优化器,不在扫描表了,而是直接从索引中拿数据,因为索引中有这些数据,这叫覆盖式查询,这样的查询速度非常快;

    4.注意事项:

    (1)对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高;
    select * from table1 where col1=A AND col2=B AND col3=D
    如果使用
    where col2=B AND col1=A
    或者
    where col2=B
    将不会使用索引。

    (2)何时是用复合索引 根据where条件建索引是极其重要的一个原则; 注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中

    (3)复合索引会替代单一索引么 如果索引满足窄索引的情况下可以建立复合索引,这样可以节约空间和时间

    (4)对一张表来说,如果有一个复合索引 on (col1,col2),就没有必要同时建立一个单索引 on col1;

    如果查询条件需要,可以在已有单索引 on col1的情况下,添加复合索引on (col1,col2),对于效率有一定的提高;

    同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。

    六、创建索引需要注意的问题

    1.创建索引
    对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加

    索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。
    但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

    2.复合索引
    比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;

    如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效

    率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。
    因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

    3.使用短索引
    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    4.排序的索引问题
    mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    5.不使用NOT IN和操作
    NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id

    七、索引失效的情况

    1.当语句中有or时:select * from user where name = ‘aaa’ or age = 18;
    2.当语句索引like带%时:select * from user where name like %’aaa’;
    3.如果列类型是字符串,一定要将数据用引号引起来:
    Select * from user where name = 123;
    4.在索引上进行操作时:比如age为索引,select * from user where age – 1 > 11;
    5.Mysql在使用全表扫描比使用索引扫描快时,则不会走索引
    6.只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
    7.条件中包含&lt、&gt(<>)

    八、索引的数据结构为什么是B+数而不是hashmap或者B树?

    1.B+树的磁盘读写代价更低
    B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

    B+树的查询效率更加稳定
    由于非叶子节点只存索引信息,而没有真正的数据信息,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

    B+树更加适合在区间查询的情况
    由于B+树的数据都存储在叶子结点中,非叶子结点均为索引,只需要扫一遍叶子结点即可得到所有数据信息,但是B树因为其非叶子结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B树更加适合在区间查询的情况,通常B+树用于数据库索引。

    展开全文
  • 基本就是两种答案,一种是不限制,一种是16列, 我认为16的由来应该网上传着传着给扭曲, 因为mysql的单个索引最多能包括16列,但是这是一个索引包含几列的答案而不是一张可以建多少个索引.真的是误导人啊! 为此我一顿...

    前言: 网上关于一张mysql表最多可以创建多少个索引?基本就是两种答案,一种是不限制,一种是16列, 我认为16的由来应该网上传着传着给扭曲, 因为mysql的单个索引最多能包括16列,但是这个是一个索引包含几列的答案而不是一张可以建多少个索引.真的是误导人啊! 为此我一顿好找终于在官网找到了权威答案, 现将mysql表的一些限制做一个总结, 希望能帮到对此有困惑的朋友们, 有用就赞下啦 ~_~

    因为mysql的一些限制跟具体存储引擎有关,为此以下只列出我们最常用的innoDB和myisam,其他存储引擎的具体限制可以去官网找.
    • innoDB: 最多创建1017列, 最多64个二级索引, 单个索引最多包含16列, 索引最大长度767字节(其实行格式为REDUNDANT,COMPACT最高为767字节,但行格式为DYNAMIC,COMPRESSED最高可达为3072字节), 行大小最大65536字节
    • mysiam: 最多4096列, 最多64个二级索引, 单个索引最多包含16列, 索引最大长度1000字节, 行大小最大65536字节
    以上都整理自mysql官方文档,有兴趣可以自己去看看

    来自我的博客:http://blog.nice100.net/mysql/14.html

    展开全文
  • mysql最多可以几个索引

    千次阅读 2017-05-08 16:50:59
    mysql中提到,一表最多16个索引,最大索引长度256字节.

    mysql中提到,一个表最多16个索引,最大索引长度256字节.

    展开全文
  • 发现mysql一个表可以几个唯一索引

    千次阅读 2018-04-26 09:07:44
    mysql一可以有多唯一索引。如果能确定某个数据列将只包含彼此各不相同的值,在为这数据列创建索引的时候就应该用关键字UNIQUE把它定义为一唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,...
  • MySQL索引创建与使用

    万次阅读 多人点赞 2018-08-06 18:49:59
    声明:本人主要简单示例MySQL中的单列索引、组合索引创建与使用。 索引创建: 建表时创建: CREATE TABLE 表名( 字段名 数据类型 [完整性约束条件], ……, [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY ...
  • 几个建索引的技巧

    2007-08-29 18:55:00
    经常检索排序大表中30% 或非排序表7%的行,建议建索引; 为了改善多表关联,索引列用于联结; 列中的值比较惟一; 列中有许多空值,不适合建立索引; 经常一起使用多字段检索记录,组合索引比单索引更有效; 不要...
  • 单列索引和联合索引的区别详解

    万次阅读 多人点赞 2018-06-24 17:40:58
    那么当查询条件为2及以上时,我们是创建单列索引还是创建联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。 一、联合索引测试 注:Mysql版本为 5.7.20 创建测试表(表记录...
  • 索引1.1 原理1.2 创建索引1.2.1 创建主键索引1.2.2 唯一索引创建1.2.3 普通索引创建1.2.4 全文索引创建1.3 查询索引1.4 删除索引1.5 索引创建的规则 1.索引   索引是对数据库表中一列或多列的值进行排序的...
  • 关于Oracle索引建立的几个注意要点

    千次阅读 2015-07-09 22:25:24
    1、创建索引的最主要的原因是可以大大加快数据的检索速度。 2、可以加速表和表之间的连接。 3、在使用分组和排序子句进行数据检索时,同样可以显着减少查询中分组和排 序的时间。 4、通过使用索引可以在查询的...
  • 利用MySQL Workbench管理索引(1)利用MySQL Workbench修改索引可以修改索引的名字、类型、索引引用字段和索引参数等。(2)利用MySQL Workbench删除索引。 1.利用MySQL Workbench创建索引 (1)启动MySQL Workbe....
  • 数据库触发联合索引几个条件

    千次阅读 2015-06-30 15:11:28
    联合索引是建立在某个表(Table)上的,由多列(Column)构成的索引。 触发联合索引是有条件的: 示例如下。首先创建表: CREATE TABLE E (e1 INT, e2 VARCHAR(9), e3 INT, PRIMARY KEY(e1, e3)); 这样就建立了一...
  • MySQL的几个概念:主键,外键,索引,唯一索引主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。...
  • 建索引大原则

    千次阅读 2017-08-10 09:43:21
    建索引大原则 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到...
  • 说到索引,很多人都知道“索引是一排序的列表,在这列表中存储着索引的值和包含这值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引可以不用扫描全表来定位某...
  • 单列索引,即一个索引只包含单个列,一可以有多单列索引,但这不是组合索引。组合索引,即一索包含多列。 MySQL索引类型包括: 一、普通索引 这是最基本的索引,它没有任何限制。它有以下创建方式...
  • mysql索引必须了解的几个重要问题

    千次阅读 2018-09-28 17:04:15
    如果表中查询的列有一个索引,mysql能快速到达一位置搜寻到数据文件的中间,没有必要查看所有数据。 大多数mysql的索引(primary key、index、unique、fulltext)在B树中存储,只是空间列类型的索引使用R树,并...
  • 性能优化|教你几个大招,轻松解决索引失效的问题
  • mysql一可以创建唯一索引

    千次阅读 2018-09-06 11:44:00
    如果能确定某个数据列将只包含彼此各不相同的值,在为这数据列创建索引的时候就应该用关键字UNIQUE把它定义为一 唯一索引 。 转载于:https://my.oschina.net/zjllovecode/blog/1973479
  • 建索引大原则1、最左前缀匹配原则,非常重要的原则mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。比如a = 1 and b = 2 and c > 3 and d = 4,如果建立(a,b,c,d)顺序的索引,d是用不...
  • 数据库创建索引种方法

    万次阅读 多人点赞 2018-11-09 10:46:26
    1、普通索引  CREATE INDEX indexName ON mytable(username(length));  创建表的时候直接指定:  CREATE TABLE mytable(  ID INT NOT NULL,   username VARCHAR(16) NOT NULL,   INDEX [indexName] (.....
  • 所有mysql列的类型都可以使用索引,例如:数据库中有两万条记录,现在要执行这样一查询:select * from table t1 where num=20000。如果没有索引,将会遍历整个表,知道num=20000,这一行数据被找到。如果在num列...
  • Oracle创建索引要做到三适当

    千次阅读 2014-10-24 10:22:20
    在Oracle数据库中,创建索引虽然比较简单。但是要合理的创建索引则比较困难了。...具体的来说,要做到这个三个适当有如下几个要求。  一、 根据表的大小来创建索引。  虽然给表创建索引可以提高查
  • 1)、查看索引 show index from 数据库表名 2)、alter table 数据库表 add index 索引名称(数据库表字段名称) 2、索引类型: 1)、PRIMARY KEY(主键索引) ALTER TABLE table_name ADD PRIMARY KEY ( column )...
  • 所以我们创建索引时有什么能参考的属性,或者要遵守的原则呢? 1.列的离散度 我们先来看一重要的属性列的离散度,公式如下: count(distinct(column_name)) : count(*) -- 列的全部不同值数:所有数据行行数 ...
  • mysql索引详解

    万次阅读 多人点赞 2021-07-07 21:40:09
    一、MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储/提取相分离。下面是MySQL的逻辑架构图: 一、对比InnoDB与MyISAM ...InnoDB:所有的表都保存在同一数据文件中(也可能是多

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 521,906
精华内容 208,762
关键字:

索引可以建几个