精华内容
下载资源
问答
  • 一.索引简介众所周知,索引是关系型数据库中给数据库表中一列或多列值排序后存储结构,SQL...SQL Sever索引类型有:唯一索引,主键索引,聚集索引,非聚集索引。MySQL 索引类型有:唯一索引,主键(聚集)索引,...

    一.索引简介

    众所周知,索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,SQL的主流索引结构有B+树以及Hash结构,聚集索引以及非聚集索引用的是B+树索引。这篇文章会总结SQL Server以及MySQL的InnoDB和MyISAM两种SQL的索引。

    SQL Sever索引类型有:唯一索引,主键索引,聚集索引,非聚集索引。
    MySQL 索引类型有:唯一索引,主键(聚集)索引,非聚集索引,全文索引。

    二.聚集索引

    聚集(clustered)索引,也叫聚簇索引。

    定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

    单单从定义来看是不是显得有点抽象,打个比方,一个表就像是我们以前用的新华字典,聚集索引就像是拼音目录,而每个字存放的页码就是我们的数据物理地址,我们如果要查询一个“哇”字,我们只需要查询“哇”字对应在新华字典拼音目录对应的页码,就可以查询到对应的“哇”字所在的位置,而拼音目录对应的A-Z的字顺序,和新华字典实际存储的字的顺序A-Z也是一样的,如果我们中文新出了一个字,拼音开头第一个是B,那么他插入的时候也要按照拼音目录顺序插入到A字的后面,现在用一个简单的示意图来大概说明一下在数据库中的样子:

    地址idusernamescore
    0x011小明90
    0x022小红80
    0x033小华92
    ........
    0xff256小英70

    注:第一列的地址表示该行数据在磁盘中的物理地址,后面三列才是我们SQL里面用的表里的列,其中id是主键,建立了聚集索引。

    结合上面的表格就可以理解这句话了吧:数据行的物理顺序与列值的顺序相同,如果我们查询id比较靠后的数据,那么这行数据的地址在磁盘中的物理地址也会比较靠后。而且由于物理排列方式与聚集索引的顺序相同,所以也就只能建立一个聚集索引了。

    0fb008c169e08e62dce1ef6160869142.png聚集索引实际存放的示意图

    从上图可以看出聚集索引的好处了,索引的叶子节点就是对应的数据节点(MySQL的MyISAM除外,此存储引擎的聚集索引和非聚集索引只多了个唯一约束,其他没什么区别),可以直接获取到对应的全部列的数据,而非聚集索引在索引没有覆盖到对应的列的时候需要进行二次查询,后面会详细讲。因此在查询方面,聚集索引的速度往往会更占优势。

    创建聚集索引

    如果不创建索引,系统会自动创建一个隐含列作为表的聚集索引。

    1.创建表的时候指定主键(注意:SQL Sever默认主键为聚集索引,也可以指定为非聚集索引,而MySQL里主键就是聚集索引)

    create table t1(
    id int primary key,
    name nvarchar(255)
    )

    2.创建表后添加聚集索引

    SQL Server

    create clustered index clustered_index on table_name(colum_name)

    MySQL

    alter table table_name add primary key(colum_name)

    值得注意的是,最好还是在创建表的时候添加聚集索引,由于聚集索引的物理顺序上的特殊性,因此如果再在上面创建索引的时候会根据索引列的排序移动全部数据行上面的顺序,会非常地耗费时间以及性能。

    三.非聚集索引

    非聚集(unclustered)索引。

    定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

    其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。

    432fdce4599b75e744b7eeb5b2cd231a.png非聚集索引实际存放的示意图

    非聚集索引的二次查询问题

    非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

    如有以下表t1:

    idusernamescore
    1小明90
    2小红80
    3小华92
    ......
    256小英70

    以及聚集索引clustered index(id), 非聚集索引index(username)。

    使用以下语句进行查询,不需要进行二次查询,直接就可以从非聚集索引的节点里面就可以获取到查询列的数据。

    select id, username from t1 where username = '小明'
    select username from t1 where username = '小明'

    但是使用以下语句进行查询,就需要二次的查询去获取原数据行的score:

    select username, score from t1 where username = '小明'

    在SQL Server里面查询效率如下所示,Index Seek就是索引所花费的时间,Key Lookup就是二次查询所花费的时间。可以看的出二次查询所花费的查询开销占比很大,达到50%。

    45d64ba50dd47219b1509b48fbb753f6.png

    在SQL Server里面会对查询自动优化,选择适合的索引,因此如果在数据量不大的情况下,SQL Server很有可能不会使用非聚集索引进行查询,而是使用聚集索引进行查询,即便需要扫描整个聚集索引,效率也比使用非聚集索引效率要高。

    f7df89a85ce3c7568e40f43c647962cc.png

    本人试过在含有30w行表上建立非聚集索引,查询非聚集索引覆盖以外的列就会变成聚集索引的全索引扫描(index scan)查询来避免二次查询,而在另外一张200w行表才会用到非聚集索引seek对应的列再进行kek lookup,有关于SQL Server的有Index seek,index scan, table scan,key LookUp这几个概念,可以查看这个blog,描写比较详细。

    但在MySQL里面就算表里数据量少且查询了非键列,也不会使用聚集索引去全索引扫描,但如果强制使用聚集索引去查询,性能反而比非聚集索引查询要差,这就是两种SQL的不同之处。

    还有一点要注意的是非聚集索引其实叶子节点除了会存储索引覆盖列的数据,也会存放聚集索引所覆盖的列数据。

    如何解决非聚集索引的二次查询问题

    复合索引(覆盖索引)

    建立两列以上的索引,即可查询复合索引里的列的数据而不需要进行回表二次查询,如index(col1, col2),执行下面的语句

    select col1, col2 from t1 where col1 = '213';

    要注意使用复合索引需要满足最左侧索引的原则,也就是查询的时候如果where条件里面没有最左边的一到多列,索引就不会起作用。

    在SQL Server中还有include的用法,可以把非聚集索引里包含的列包含进来,而不一定需要建立复合索引。

    四.总结与使用心得

    1. 使用聚集索引的查询效率要比非聚集索引的效率要高,但是如果需要频繁去改变聚集索引的值,写入性能并不高,因为需要移动对应数据的物理位置。

    2. 非聚集索引在查询的时候可以的话就避免二次查询,这样性能会大幅提升。

    3. 不是所有的表都适合建立索引,只有数据量大表才适合建立索引,且建立在选择性高的列上面性能会更好。

    展开全文
  • 基本语法MySQL 提供了三种创建索引的方法:1) 使用 CREATE INDEX 语句可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。语法格式:CREATE ON ( [] [ ASC | DESC])语法...

    索引的建立对于 MySQL 数据库的高效运行是很重要的,索引可以大大提升 MySQL 的检索速度。

    基本语法

    MySQL 提供了三种创建索引的方法:

    1) 使用 CREATE INDEX 语句

    可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。

    语法格式:

    CREATE ON ( [] [ ASC | DESC])

    语法说明如下:

    :指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。

    :指定要创建索引的表名。

    :指定要创建索引的列名。通常可以考虑将查询语句中在 JOIN 子句和 WHERE 子句里经常出现的列作为索引列。

    :可选项。指定使用列前的 length 个字符来创建索引。使用列的一部分创建索引有利于减小索引文件的大小,节省索引列所占的空间。在某些情况下,只能对列的前缀进行索引。索引列的长度有一个最大上限 255 个字节(MyISAM 和 InnoDB 表的最大上限为 1000 个字节),如果索引列的长度超过了这个上限,就只能用列的前缀进行索引。另外,BLOB 或 TEXT 类型的列也必须使用前缀索引。

    ASC|DESC:可选项。ASC指定索引按照升序来排列,DESC指定索引按照降序来排列,默认为ASC。

    2) 使用 CREATE TABLE 语句

    索引也可以在创建表(CREATE TABLE)的同时创建。在 CREATE TABLE 语句中添加以下语句。语法格式:

    CONSTRAINT PRIMARY KEY [索引类型] (,…)

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的主键。

    语法格式:

    KEY | INDEX [] [] (,…)

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的索引。

    语法格式:

    UNIQUE [ INDEX | KEY] [] [] (,…)

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的唯一性索引。

    语法格式:

    FOREIGN KEY

    在 CREATE TABLE 语句中添加此语句,表示在创建新表的同时创建该表的外键。

    在使用 CREATE TABLE 语句定义列选项的时候,可以通过直接在某个列定义后面添加 PRIMARY KEY 的方式创建主键。而当主键是由多个列组成的多列索引时,则不能使用这种方法,只能用在语句的最后加上一个 PRIMARY KRY(,…) 子句的方式来实现。

    3) 使用 ALTER TABLE 语句

    CREATE INDEX 语句可以在一个已有的表上创建索引,ALTER TABLE 语句也可以在一个已有的表上创建索引。在使用 ALTER TABLE 语句修改表的同时,可以向已有的表添加索引。具体的做法是在 ALTER TABLE 语句中添加以下语法成分的某一项或几项。

    语法格式:

    ADD INDEX [] [] (,…)

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加索引。

    语法格式:

    ADD PRIMARY KEY [] (,…)

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加主键。

    语法格式:

    ADD UNIQUE [ INDEX | KEY] [] [] (,…)

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加唯一性索引。

    语法格式:

    ADD FOREIGN KEY [] (,…)

    在 ALTER TABLE 语句中添加此语法成分,表示在修改表的同时为该表添加外键。

    创建一般索引

    【实例 1】创建一个表 tb_stu_info,在该表的 height 字段创建一般索引。输入的 SQL 语句和执行过程如下所示。

    mysql> CREATE TABLE tb_stu_info

    -> (

    -> id INT NOT NULL,

    -> name CHAR(45) DEFAULT NULL,

    -> dept_id INT DEFAULT NULL,

    -> age INT DEFAULT NULL,

    -> height INT DEFAULT NULL,

    -> INDEX(height)

    -> );

    Query OK,0 rows affected (0.40 sec)

    mysql> SHOW CREATE TABLE tb_stu_info\G

    *************************** 1. row ***************************

    Table: tb_stu_info

    Create Table: CREATE TABLE `tb_stu_info` (

    `id` int(11) NOT NULL,

    `name` char(45) DEFAULT NULL,

    `dept_id` int(11) DEFAULT NULL,

    `age` int(11) DEFAULT NULL,

    `height` int(11) DEFAULT NULL,

    KEY `height` (`height`)

    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312

    1 row in set (0.01 sec)

    创建唯一索引

    【实例 2】创建一个表 tb_stu_info2,在该表的 id 字段上使用 UNIQUE 关键字创建唯一索引。输入的 SQL 语句和执行过程如下所示。

    mysql> CREATE TABLE tb_stu_info2

    -> (

    -> id INT NOT NULL,

    -> name CHAR(45) DEFAULT NULL,

    -> dept_id INT DEFAULT NULL,

    -> age INT DEFAULT NULL,

    -> height INT DEFAULT NULL,

    -> UNIQUE INDEX(height)

    -> );

    Query OK,0 rows affected (0.40 sec)

    mysql> SHOW CREATE TABLE tb_stu_info2\G

    *************************** 1. row ***************************

    Table: tb_stu_info2

    Create Table: CREATE TABLE `tb_stu_info2` (

    `id` int(11) NOT NULL,

    `name` char(45) DEFAULT NULL,

    `dept_id` int(11) DEFAULT NULL,

    `age` int(11) DEFAULT NULL,

    `height` int(11) DEFAULT NULL,

    UNIQUE KEY `height` (`height`)

    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312

    1 row in set (0.00 sec)

    查看索引

    在 MySQL 中,如果要查看已创建的索引的情况,可以使用 SHOW INDEX 语句查看表中创建的索引。

    语法格式:

    SHOW INDEX FROM [ FROM ]

    语法说明如下:

    :要显示索引的表。

    :要显示的表所在的数据库。

    显示数据库 mytest 的表 course 的索引情况。

    mysql> SHOW INDEX FROM course FROM mytest;

    该语句会返回一张结果表,该表有如下几个字段,每个字段所显示的内容说明如下。

    Table:表的名称。

    Non_unique:用于显示该索引是否是唯一索引。若不是唯一索引,则该列的值显示为 1;若是唯一索引,则该列的值显示为 0。

    Key_name:索引的名称。

    Seq_in_index:索引中的列序列号,从 1 开始计数。

    Column_name:列名称。

    Collation:显示列以何种顺序存储在索引中。在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类。

    Cardinality:显示索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL 使用该索引的机会就越大。

    Sub_part:若列只是被部分编入索引,则为被编入索引的字符的数目。若整列被编入索引,则为 NULL。

    Packed:指示关键字如何被压缩。若没有被压缩,则为 NULL。

    Null:用于显示索引列中是否包含 NULL。若列含有 NULL,则显示为 YES。若没有,则该列显示为 NO。

    Index_type:显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)。

    Comment:显示评注。

    【实例 3】使用 SHOW INDEX 语句查看表 tb_stu_info2 的索引信息,输入的 SQL 语句和执行结果如下所示。

    mysql> SHOW INDEX FROM tb_stu_info2\G

    *************************** 1. row ***************************

    Table: tb_stu_info2

    Non_unique: 0

    Key_name: height

    Seq_in_index: 1

    Column_name: height

    Collation: A

    Cardinality: 0

    Sub_part: NULL

    Packed: NULL

    Null: YES

    Index_type: BTREE

    Comment:

    Index_comment:

    1 row in set (0.03 sec)

    < 上一页MySQL索引简介

    MySQL修改和删除索引下一页 >

    展开全文
  • 转自http://blog.itpub.net/29272216/viewspace-1243730/转...主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardin...

    转自http://blog.itpub.net/29272216/viewspace-1243730/

    转https://www.cnblogs.com/wezheng/p/8399305.html

    索引关键字的选取原则

    1、  表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就等于该表的行数。MySQL在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时,MySQL自动创建主索引(primary index),且索引名称为Primary;数据库用户创建唯一性索引时,MySQL自动创建唯一性索引(unique index),默认情况下,索引名为唯一性索引的字段名。

    2、  占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。

    3、  存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字。

    4、  Where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。

    5、  更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。

    6、  最左前缀原则。

    7、  尽量使用前缀索引。

    引入索引的目的就是提高数据的检查效率,因此索引关键字的选择与select语句息息相关。这句话有两个含义:一是,select语句的设计可以决定索引的设计;索引的设计也同样影响着select语句的设计。例如原则1与原则2,可以影响select语句的设计;而select语句中的where子句、group by子句以及,又可以影响索引的设计。两个表的连接字段应该创建索引,外键约束一经创建,MySQL会自动地创建与外键相对应的索引,这是由于外键字段通常是两个表的连接字段。

    复合索引还有一个优点,它通过被称为“最左前缀”(leftmost prefixing)的概念体现出来的。假设向一个表的多个字段(例如fristname、lastname、address)创建复合索引(索引名为fname_lname_address).当where查询条件是以下各种字段的组合是,MySQL将使用fname_lname_address索引。其他情况将无法使用fname_lname_address索引。可以理解:一个复合索引(firstname、lastname、address)等效于(firstname,llastname,age)、(firstname,lastname)以及(firstname)三个索引。基于最做前缀原则,应尽量避免创建重复的索引,例如,创建了fname_lname_address索引后,就无需再first_name子段上单独创建一个索引。

    如果数据库表的存储引擎是MyISAM,那么创建主键的约束的同时,MySQL会自动创建主键索引。如果数据库表的存储引擎是InnoDB,那么创建主键约束的同时,MySQL会自动创建聚簇索引。

    MySQL还支持全文索引(fulltext),当查询数据量大的字符串信息时,使用全文索引可以大幅提升字符串的检索效率。需要注意的是,全文索引只能创建在char、varchar或者text字符串类型的字段上,且全文索引不支持前缀索引。

    最左前缀原则  mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:  如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引; 如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;

    1、b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。  2、比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)  关于最左前缀的使用,有下面两条说明:  最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。 =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 关于最左前缀的例子,请参考:https://www.kancloud.cn/kancloud/theory-of-mysql-index/41857  什么时候索引会失效  如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 对于多列索引,不是使用的第一部分,则不会使用索引(即不符合最左前缀原则) like查询是以%开头 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 如果mysql估计使用全表扫描要比使用索引快,则不使用索引

    此外,查看索引的使用情况  show status like ‘Handler_read%’; 大家可以注意: handler_read_key:这个值越高越好,越高表示使用索引查询到的次数 handler_read_rnd_next:这个值越高,说明查询低效

    展开全文
  • 1、表的某个字段值得离散度越高,该字段越适合选作索引的关键字主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就...

    索引关键字的选取原则

    1、  表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就等于该表的行数。MySQL在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时,MySQL自动创建主索引(primary index),且索引名称为Primary;数据库用户创建唯一性索引时,MySQL自动创建唯一性索引(unique index),默认情况下,索引名为唯一性索引的字段名。

    2、  占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。

    3、  存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字。

    4、  Where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。

    5、  更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。

    6、  最左前缀原则。

    7、  尽量使用前缀索引。

    引入索引的目的就是提高数据的检查效率,因此索引关键字的选择与select语句息息相关。这句话有两个含义:一是,select语句的设计可以决定索引的设计;索引的设计也同样影响着select语句的设计。例如原则1与原则2,可以影响select语句的设计;而select语句中的where子句、group by子句以及,又可以影响索引的设计。两个表的连接字段应该创建索引,外键约束一经创建,MySQL会自动地创建与外键相对应的索引,这是由于外键字段通常是两个表的连接字段。

      复合索引还有一个优点,它通过被称为“最左前缀”(leftmost prefixing)的概念体现出来的。假设向一个表的多个字段(例如fristname、lastname、address)创建复合索引(索引名为fname_lname_address).当where查询条件是以下各种字段的组合是,MySQL将使用fname_lname_address索引。其他情况将无法使用fname_lname_address索引。可以理解:一个复合索引(firstname、lastname、address)等效于(firstname,llastname,age)、(firstname,lastname)以及(firstname)三个索引。基于最做前缀原则,应尽量避免创建重复的索引,例如,创建了fname_lname_address索引后,就无需再first_name子段上单独创建一个索引。

     

    如果数据库表的存储引擎是MyISAM,那么创建主键的约束的同时,MySQL会自动创建主键索引。如果数据库表的存储引擎是InnoDB,那么创建主键约束的同时,MySQL会自动创建聚簇索引。

      MySQL还支持全文索引(fulltext),当查询数据量大的字符串信息时,使用全文索引可以大幅提升字符串的检索效率。需要注意的是,全文索引只能创建在char、varchar或者text字符串类型的字段上,且全文索引不支持前缀索引。

    展开全文
  • 会自动为主键创建索引。数据库管理器使用主索引来有效地访问表行,且主索引允许数据库管理器强制主键的唯一性。(也可以在非主键列上定义索引,以便在处理查询时高效率地访问数据。) 关键字就是为了方便编程...
  • 1 索引的管理索引有很多中类型:普通索引、唯一索引、主键索引、组合索引、全文索引,下面我们看看如何创建和删除下面这些类型的索引。1.1 索引的创建方式索引的创建是可以在很多种情况下进行的。直接创建索引CREATE...
  • 1、普通索引  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件... 普通索引允许被索引的数据列包含重复的值。比
  • MySQL InnoDB 存储引擎是必须要有一...创建主键的三种方式:在建表语句字段后指定 PRIMARY KEY 关键字设置主键,这种方式只能定义主键为一个字段情况,如下所示:CREATE TABLE `t_user` (`id` int(11) NOT NULL A...
  • 简单描述MySQL中,索引,主键,唯一索引,...如果能确定某个数据列将只包含彼 此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它 定义为一个唯一索引。 也就是说,唯一索引可以保证数据记录的唯
  • 最近跳槽,复习mysql索引发些帖子中的索引失效情况跟我自己测试的不太一样 所以写个文章把测试记录一下 表和表索引如图 索引创建成功开始测试 1. in关键字影响索引使用存在边界 ...主键索引的边界值是7和...
  • 主键和唯一索引

    2017-02-21 17:45:13
    主键:主关键字(primary key)是表中一个或多个字段,它值用于唯一地标识表中某一条记录。 唯一索引:一种索引,不允许具有索引值相同行,从而禁止重复的索引或键值。系统在创建索引时检查是否有重复...
  •  普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列常创建索引时应该用就用关键字UNIQUE把他定义成一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一...
  • 索引是一种特殊的文件(InnoDB数据表上的...如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一...
  • 聚集索引主键的区别有哪些

    千次阅读 2014-08-16 13:13:58
     一、主键   主关键字主键,primary key)是被挑选出来,作表唯一标识候选关键字。一个表只有一个主...主键是唯一,所以创建了一个主键的同时,也就这个字段创建了一个唯一的索引, 唯一索引
  • 索引是一种特殊的文件(InnoDB数据表上的...如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一...
  • 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个...如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保
  • MySQL表中索引主键和唯一性区别

    千次阅读 2017-07-26 11:23:33
    PRIMARY 主键: 就是 唯一 且 不能为空。 INDEX 索引: 普通 UNIQUE 唯一索引: 不允许有重复。...在一张表中只能定义一个主键索引,使用关键字 PRIMARY KEY 来创建。 2.索引(INDEX ):
  • 适合创建索引的列是出现在 WHERE 或 ON 子句中的列,而不是出现在 SELECT 关键字后的列 索引列的基数越大,数据区分度越高,索引的效果越好 对字符串列进行索引,可制定一个前缀长度,节省索引空间 避免创建过多...
  • 2、延伸1)MySQL索引的创建原则① 最适合索引的列是出现在 `WHERE`子句中的列,或连接子句中的列,而不是出现在 `SELECT`关键字后的列(where/on 后面的列);② 索引列的基数越大,索引的效果越好;③ 对字符串进行...
  • 主键(primary key)是表中一个或多个字段,它值用于唯一地标识表中某一条记录,在两个表关系中,主键用来在一个表中...oracle中创建主键后会自动生成一个唯一索引,并且该唯一索引可以在user_indexes视图...
  • 查询方式:一种是:全表扫描;一种是:利用数据表上建立所以进行扫描。如:对表中name字段建立索引;则按照表中name字段进行索引排序,并为其建立指向数据表中记录所在位置“指针”。...3.主键索引主键索引是...
  • 索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成...如果能确定某个数据列将只包含彼 此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它 定义为一个唯一索引。 也就是说,唯一...
  • MySQL创建全文索引

    千次阅读 2016-09-28 16:31:11
    在MySQL数据库中,有四种索引:聚集索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍全文索引(FULLTEXT INDEX)。 全文索引(也称全文检索)是目前搜索引擎使用一种关键技术。它能够利用「分词技术「等...
  • * 每张表都有一个主键索引并且只有一个一般都是在创建表时为表创建主键时候就创建主键索引另外也可以通过关键字ALTER增加主键索引 创建主键索引 Part 4 通过关键字ALTER增加主键语法规则 ALTER TABLE 表名 ADD ...
  • 建立索引的原则: 定义主键的数据列一定要建立索引。 定义有外键的数据列一定要建立索引。 对于经常查询的数据列最好...如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

创建主键索引的关键字是