精华内容
下载资源
问答
  • 2021-12-13 18:22:40

    1.添加PRIMARY KEY(主键索引):

    ALTER TABLE table_name ADD PRIMARY KEY ( column )

    2.添加UNIQUE(唯一索引) :

    ALTER TABLE table_name ADD UNIQUE ( column )

    3.添加INDEX(普通索引) :
    ALTER TABLE table_name ADD INDEX index_name ( column )

    4.添加FULLTEXT(全文索引) :
    ALTER TABLE table_name ADD FULLTEXT ( column)

    5.添加多列索引:
    ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

    更多相关内容
  • MySQL中四种方式给字段添加索引

    千次阅读 2021-08-24 18:04:54
    MySQL给字段创建索引的四种方式: 添加主键 ALTER TABLE tbl_name ADD PRIMARY KEY (col_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 添加唯一索引 ALTER TABLE tbl_name ADD UNIQUE...

    MySQL中给字段创建索引的四种方式:

    添加主键

    ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
    该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL

    添加唯一索引

    ALTER TABLE tbl_name ADD UNIQUE index_name (col_list);
    这条语句创建索引的值必须是唯一的。
    

    添加普通索引

    ALTER TABLE tbl_name ADD INDEX index_name (col_list);
    添加普通索引,索引值可出现多次。
    

    添加全文索引

    ALTER TABLE tbl_name ADD FULLTEXT index_name (col_list);
    该语句指定了索引为 FULLTEXT ,用于全文索引。
    

    PS: 附赠删除索引的语法:

    复制代码

    DROP INDEX index_name ON tbl_name;
    或者
    ALTER TABLE tbl_name DROP INDEX index_name;
    ALTER TABLE tbl_name DROP PRIMARY KEY;
    
    展开全文
  • 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常用的建表、添加字段、修改字段添加索引SQL语句写法。分享大家供大家参考,具体如下: 建表: DROP TABLE IF EXISTS bulletin; CREATE TABLE bulletin( id INT NOT NULL PRIMARY KEY AUTO...
  • MySQL给某个字段添加索引

    千次阅读 2020-06-03 17:57:42
    1、为cht_apps表的META_AID字段添加主键索引(PRIMARY KEY): ALTER TABLE cht_apps ADD PRIMARY KEY (META_AID) 执行结果: 表结构: 一张表只能有一个主键索引,再次添加会报重复主键: 2、为cht_apps表的...

    1、为cht_apps表的META_AID字段添加主键索引(PRIMARY KEY):

    ALTER TABLE svip ADD PRIMARY KEY (vip_id)
    

    执行结果:
    在这里插入图片描述
    表结构:
    在这里插入图片描述
    一张表只能有一个主键索引,再次添加会报重复主键:
    在这里插入图片描述

    2、为cht_apps表的META_BUSSINESS字段添加普通索引(INDEX),索引名字叫index_bussiness:
    在这里插入图片描述
    表结构:
    在这里插入图片描述
    3、为cht_apps表的META_NAME字段添加唯一索引(UNIQUE):

    ALTER TABLE svip ADD UNIQUE (vip_cardID)
    

    4、为cht_apps表的META_BUSSINESS字段添加全文索引(FULLTEXT)

    ALTER TABLE svip ADD FULLTEXT (vip_mark)
    

    5、为cht_apps表添加多列索引:

    ALTER TABLE svip ADD INDEX index_contact (vip_phone,vip_address)
    

    6、查询svip表索引:

    SHOW INDEX FROM svip
    

    在这里插入图片描述
    7、删除svip表的index_contact索引:

    DROP INDEX index_contact ON svip
    
    展开全文
  • 下面小编就为大家带来一篇MySQL修改表一次添加多个列(字段)和索引的方法。小编觉得挺不错的,现在就分享大家,也大家做个参考。一起跟随小编过来看看吧
  • 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser( ID bigint ...

    现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。

    假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:

    mysql> create table SUser(
    ID bigint unsigned primary key,
    email varchar(64), 
    ... 
    )engine=innodb; 
    复制代码

    由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:

    mysql> select f1, f2 from SUser where email='xxx';
    复制代码

    从第 4 和第 5 篇讲解索引的文章中,我们可以知道,如果 email 这个字段上没有索引,那么这个语句就只能做全表扫描。

    同时,MySQL 是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。

    比如,这两个在 email 字段上创建索引的语句:

    mysql> alter table SUser add index index1(email);
    或
    mysql> alter table SUser add index index2(email(6));
    复制代码

    第一个语句创建的 index1 索引里面,包含了每个记录的整个字符串;而第二个语句创建的 index2 索引里面,对于每个记录都是只取前 6 个字节。

    那么,这两种不同的定义在数据结构和存储上有什么区别呢?如图 2 和 3 所示,就是这两个索引的示意图。


                                                        图 1 email 索引结构

                                                          图 2 email(6) 索引结构

    从图中你可以看到,由于 email(6) 这个索引结构中每个邮箱字段都只取前 6 个字节(即:zhangs),所以占用的空间会更小,这就是使用前缀索引的优势。

    但,这同时带来的损失是,可能会增加额外的记录扫描次数。

    接下来,我们再看看下面这个语句,在这两个索引定义下分别是怎么执行的。

    select id,name,email from SUser where email='zhangssxyz@xxx.com';
    复制代码

    (即 email 整个字符串的索引结构),执行顺序是这样的:

    1. 从 index1 索引树找到满足索引值是’zhangssxyz@xxx.com’的这条记录,取得 ID2 的值;
    2. 到主键上查到主键值是 ID2 的行,判断 email 的值是正确的,将这行记录加入结果集;
    3. 取 index1 索引树上刚刚查到的位置的下一条记录,发现已经不满足 email='zhangssxyz@xxx.com’的条件了,循环结束。

    这个过程中,只需要回主键索引取一次数据,所以系统认为只扫描了一行。

    如果使用的是 index2(即 email(6) 索引结构),执行顺序是这样的:

    1. 从 index2 索引树找到满足索引值是’zhangs’的记录,找到的第一个是 ID1;
    2. 到主键上查到主键值是 ID1 的行,判断出 email 的值不是’zhangssxyz@xxx.com’,这行记录丢弃;
    3. 取 index2 上刚刚查到的位置的下一条记录,发现仍然是’zhangs’,取出 ID2,再到 ID 索引上取整行然后判断,这次值对了,将这行记录加入结果集;
    4. 重复上一步,直到在 idxe2 上取到的值不是’zhangs’时,循环结束。

    在这个过程中,要回主键索引取 4 次数据,也就是扫描了 4 行。

    通过这个对比,你很容易就可以发现,使用前缀索引后,可能会导致查询语句读数据的次数变多。

    但是,对于这个查询语句来说,如果你定义的 index2 不是 email(6) 而是 email(7),也就是说取 email 字段的前 7 个字节来构建索引的话,即满足前缀’zhangss’的记录只有一个,也能够直接查到 ID2,只扫描一行就结束了。

    也就是说使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。

    于是,你就有个问题:当要给字符串创建前缀索引时,有什么方法能够确定我应该使用多长的前缀呢?

    实际上,我们在建立索引时关注的是区分度,区分度越高越好。因为区分度越高,意味着重复的键值越少。因此,我们可以通过统计索引上有多少个不同的值来判断要使用多长的前缀。

    首先,你可以使用下面这个语句,算出这个列上有多少个不同的值:

    mysql> select count(distinct email) as L from SUser;
    复制代码

    然后,依次选取不同长度的前缀来看这个值,比如我们要看一下 4~7 个字节的前缀索引,可以用这个语句:

    mysql> select 
      count(distinct left(email,4))as L4,
      count(distinct left(email,5))as L5,
      count(distinct left(email,6))as L6,
      count(distinct left(email,7))as L7,
    from SUser;
    复制代码

    当然,使用前缀索引很可能会损失区分度,所以你需要预先设定一个可以接受的损失比例,比如 5%。然后,在返回的 L4~L7 中,找出不小于 L * 95% 的值,假设这里 L6、L7 都满足,你就可以选择前缀长度为 6。

    前缀索引对覆盖索引的影响

    前面我们说了使用前缀索引可能会增加扫描行数,这会影响到性能。其实,前缀索引的影响不止如此,我们再看一下另外一个场景。

    你先来看看这个 SQL 语句:

    select id,email from SUser where email='zhangssxyz@xxx.com';
    复制代码

    与前面例子中的 SQL 语句

    select id,name,email from SUser where email='zhangssxyz@xxx.com';
    复制代码

    相比,这个语句只要求返回 id 和 email 字段。

    所以,如果使用 index1(即 email 整个字符串的索引结构)的话,可以利用覆盖索引,从 index1 查到结果后直接就返回了,不需要回到 ID 索引再去查一次。而如果使用 index2(即 email(6) 索引结构)的话,就不得不回到 ID 索引再去判断 email 字段的值。

    即使你将 index2 的定义修改为 email(18) 的前缀索引,这时候虽然 index2 已经包含了所有的信息,但 InnoDB 还是要回到 id 索引再查一下,因为系统并不确定前缀索引的定义是否截断了完整信息。

    也就是说,使用前缀索引就用不上覆盖索引对查询性能的优化了,这也是你在选择是否使用前缀索引时需要考虑的一个因素。

    其他方式

    对于类似于邮箱这样的字段来说,使用前缀索引的效果可能还不错。但是,遇到前缀的区分度不够好的情况时,我们要怎么办呢?

    比如,我们国家的身份证号,一共 18 位,其中前 6 位是地址码,所以同一个县的人的身份证号前 6 位一般会是相同的。

    假设你维护的数据库是一个市的公民信息系统,这时候如果对身份证号做长度为 6 的前缀索引的话,这个索引的区分度就非常低了。

    按照我们前面说的方法,可能你需要创建长度为 12 以上的前缀索引,才能够满足区分度要求。

    但是,索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。

    那么,如果我们能够确定业务需求里面只有按照身份证进行等值查询的需求,还有没有别的处理方法呢?这种方法,既可以占用更小的空间,也能达到相同的查询效率。

    答案是,有的。

    第一种方式是使用倒序存储。如果你存储身份证号的时候把它倒过来存,每次查询的时候,你可以这么写:

    mysql> select field_list from t where id_card = reverse('input_id_card_string');
    复制代码

    由于身份证号的最后 6 位没有地址码这样的重复逻辑,所以最后这 6 位很可能就提供了足够的区分度。当然了,实践中你不要忘记使用 count(distinct) 方法去做个验证。

    第二种方式是使用 hash 字段。你可以在表上再创建一个整数字段,来保存身份证的校验码,同时在这个字段上创建索引。

    mysql> alter table t add id_card_crc int unsigned, add index(id_card_crc);
    复制代码

    然后每次插入新记录的时候,都同时用 crc32() 这个函数得到校验码填到这个新字段。由于校验码可能存在冲突,也就是说两个不同的身份证号通过 crc32() 函数得到的结果可能是相同的,所以你的查询语句 where 部分要判断 id_card 的值是否精确相同。

    mysql> select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'
    复制代码

    这样,索引的长度变成了 4 个字节,比原来小了很多。

    接下来,我们再一起看看使用倒序存储和使用 hash 字段这两种方法的异同点。

    首先,它们的相同点是,都不支持范围查询。倒序存储的字段上创建的索引是按照倒序字符串的方式排序的,已经没有办法利用索引方式查出身份证号码在 [ID_X, ID_Y] 的所有市民了。同样地,hash 字段的方式也只能支持等值查询。

    它们的区别,主要体现在以下三个方面:

    1. 从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。当然,倒序存储方式使用 4 个字节的前缀长度应该是不够的,如果再长一点,这个消耗跟额外这个 hash 字段也差不多抵消了。
    2. 在 CPU 消耗方面,倒序方式每次写和读的时候,都需要额外调用一次 reverse 函数,而 hash 字段的方式需要额外调用一次 crc32() 函数。如果只从这两个函数的计算复杂度来看的话,reverse 函数额外消耗的 CPU 资源会更小些。
    3. 从查询效率上看,使用 hash 字段方式的查询性能相对更稳定一些。因为 crc32 算出来的值虽然有冲突的概率,但是概率非常小,可以认为每次查询的平均扫描行数接近 1。而倒序存储方式毕竟还是用的前缀索引的方式,也就是说还是会增加扫描行数。

    在实际应用中,你要根据业务字段的特点选择使用哪种方式。

    好了,又到了最后的问题时间。

    如果你在维护一个学校的学生信息数据库,学生登录名的统一格式是”学号 @gmail.com", 而学号的规则是:十五位的数字,其中前三位是所在城市编号、第四到第六位是学校编号、第七位到第十位是入学年份、最后五位是顺序编号。

    系统登录的时候都需要学生输入登录名和密码,验证正确后才能继续使用系统。就只考虑登录验证这个行为的话,你会怎么设计这个登录名的索引呢?

    你可以把你的分析思路和设计结果写在留言区里,我会在下一篇文章的末尾和你讨论这个问题。感谢你的收听,也欢迎你把这篇文章分享给更多的朋友一起阅读。

    上期问题时间

    在上一篇文章最后,我给你留的问题是,为什么经过这个操作序列,explain 的结果就不对了?这里,我来为你分析一下原因。

    delete 语句删掉了所有的数据,然后再通过 call idata() 插入了 10 万行数据,看上去是覆盖了原来的 10 万行。

    但是,session A 开启了事务并没有提交,所以之前插入的 10 万行数据是不能删除的。这样,之前的数据每一行数据都有两个版本,旧版本是 delete 之前的数据,新版本是标记为 deleted 的数据。

    这样,索引 a 上的数据其实就有两份。

    然后你会说,不对啊,主键上的数据也不能删,那没有使用 force index 的语句,使用 explain 命令看到的扫描行数为什么还是 100000 左右?(潜台词,如果这个也翻倍,也许优化器还会认为选字段 a 作为索引更合适)

    是的,不过这个是主键,主键是直接按照表的行数来估计的。而表的行数,优化器直接用的是 show table status 的值。

    这个值的计算方法,我会在后面有文章为你详细讲解。



    转载于:https://juejin.im/post/5d034449f265da1bab29aaa4

    展开全文
  • mysql字段唯一索引

    千次阅读 2021-01-19 06:32:34
    例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定:例如:user表中有userID,userName两个字段,如果不希望有2条一模一样的记录,需要user表添加多个字段的联合唯一索引:alter...
  • 本文主要向大家介绍了MySQL数据库之mysql字段添加和删除唯一性索引(unique) 的方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。1、添加PRIMARYKEY(主键索引)mysql>ALTERTABLE`table_name...
  • mysql字段索引

    千次阅读 2018-09-14 16:44:46
    1、添加普通索引 ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 案例:ALTER TABLE ts_storage_partinfo_order_batch ADD INDEX IDX_ISB (id_source_bill); 2、添加主键索引 ALTER TABLE `table...
  • mysqlmysql时间字段怎么加索引

    千次阅读 2021-02-02 16:12:26
    查出5万条结果大约需要4.5秒,这个字段已经加了普通索引,但是explain的类型还是ALL。怎么优化?语句是between and。换了>=和<=查询需要的时间也差不多。SELECT id,name,sex,city,headimg FROM user WHERE ...
  • MySQL 8.0.17开始, InnoDB支持创建多值索引(Multi-Valued Indexes),该索引是在JSON存储值数组的列上定义的二级索引,对于单个数据记录可以有多个索引记录。跟普通索引一样,也可以在`EXPLAIN`中查看到。
  • 为数据库表中 某个字段增加索引

    千次阅读 2021-01-19 15:17:41
    按照创建时间查询数据,创建时间非索引 ,现在要优化一下 因此要为student_recode 表中的created_time增加索引MySQL如何为字段添加索引1.添加主键索引(PRIMARY KEY)ALTER TABLE `table_name` ADDPRIMARY KEY ( `...
  • MySQL如何建立JSON字段索引

    千次阅读 2019-03-27 16:29:15
    概述 MySQL从5.7.8起开始支持JSON字段,这极大的丰富了...但MySQL并没有提供对JSON对象中的字段进行索引的功能,至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中...
  • mysql时间字段使用索引

    千次阅读 2020-12-23 17:24:16
    索引可以提高查询效率,平时按照时间查询经常遇到,所以就会时间添加索引,但是添加索引怎么用呢? 首先创建一张表test_table 然后时间字段创建索引 导入大量数据,可以使用存储过程 查看一下表中数据...
  • 【数据库】mysql哪些字段适合加索引

    千次阅读 2021-02-03 15:36:07
    数据库中字段适合添加索引的有表中某个字段值离散度越高越适合,占用存储空间少的字段,存储空间固定的字段,where子句中经常用到的字段等1、表的某个字段值得离散度越高,该字段越适合选作索引的关键字。...
  • MySQL给表里的某个字段建立索引

    千次阅读 2019-04-15 15:29:41
    注:`table_name` 和 `column` 中的``是Esc下方的一个键 ~`,可省略不写``,直接写表名和字段名 1.添加PRIMARY KEY(主键索引): ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引)...
  • mysql需要在哪些字段上加索引

    千次阅读 2021-03-03 20:48:56
    mysql需要加索引字段:1、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;2、经常与其他表进行连接的表,在连接字段上应该建立索引;3、分组字段或者排序字段应该创建索引;4、选择性高的字段上...
  • 如何在DATETIME字段的日期部分创建索引mysql> SHOW COLUMNS FROM transactionlist;+-------------------+------------------+------+-----+---------+----------------+| Field | Type | Null | Key |...
  • 会发现随着表中记录的增多,查询的速度也会也来越慢,特别是那种日志记录,少则几十万,多则上百万,甚至上千万数据,如果查询一次耗时太长,会严重影响业务逻辑,这时候可以考虑经常作为条件的字段添加索引了...
  • Mysql索引-可以text字段索引吗?

    千次阅读 2021-04-06 21:11:03
    结论,直接在text字段索引会报错;指定索引前缀的长度,并且长度小于等于767(utf8mb4字符集)、长度小于等于1023(utf8字符集)则可以创建索引。 例如对于Mysql5.7,如下的语句会报错”索引长度最大为3072...
  • school表名要使用tab上面按键的符号 code:为加入索引字段 alter table `school` add unique (`code`);
  • mysql多个字段唯一索引

    千次阅读 2021-01-18 22:16:38
    方法:unique index(字段一,字段二)例子:CREATETABLEIFNOTEXISTS`ppserver`.`eventTable`(`userId`INTUNSIGNEDNOTnull,`taskId`INTUNSIGNEDNOTnull,`date`TIMESTAMP...
  • 操作字段都是ALTER TABLE 表名 的格式 MySQL语句增加字段,修改字段名,修改类型,修改默认值 2、添加字段 ALTER TABLE USERS ADD alias varchar(20) COMMENT '别名'; alter table 表名 ADD 字段 类型 约束 [默认值 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 283,268
精华内容 113,307
关键字:

mysql给字段添加索引

mysql 订阅