首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 创建表时加索引

基础概念

MySQL中的索引是一种数据结构,它可以帮助数据库高效地检索数据。索引可以看作是一本书的目录,通过目录可以快速找到所需内容,而无需翻阅整本书。在MySQL中,索引可以创建在表的一个或多个列上。

相关优势

  1. 提高查询速度:索引可以显著减少数据库需要扫描的数据量,从而加快查询速度。
  2. 优化排序和分组:索引可以帮助数据库更快地完成排序和分组操作。
  3. 唯一性约束:通过创建唯一索引,可以确保表中的某些列的值是唯一的。

类型

  1. 普通索引(INDEX):最基本的索引类型,没有唯一性要求。
  2. 唯一索引(UNIQUE INDEX):确保索引列的值是唯一的。
  3. 主键索引(PRIMARY KEY):一种特殊的唯一索引,每个表只能有一个主键。
  4. 全文索引(FULLTEXT INDEX):用于全文搜索,适用于文本数据。
  5. 空间索引(SPATIAL INDEX):用于地理空间数据类型。

应用场景

  • 经常用于查询条件的列:如果某个列经常用于WHERE子句中的查询条件,那么在该列上创建索引可以提高查询效率。
  • 连接操作:在连接操作中,索引可以加速匹配过程。
  • 排序和分组:如果经常需要对某个列进行排序或分组,那么在该列上创建索引可以提高性能。

创建表的示例

假设我们有一个用户表users,包含以下列:id(主键)、usernameemailage

代码语言:txt
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    age INT,
    INDEX idx_username (username),
    INDEX idx_age (age)
);

在这个例子中,我们为usernameage列创建了普通索引,为email列创建了唯一索引。

遇到的问题及解决方法

问题:为什么索引没有提高查询速度?

原因

  1. 索引未被使用:查询条件可能没有使用到索引列,或者使用了函数、运算符等导致索引失效。
  2. 数据量较小:对于小数据量的表,索引带来的性能提升可能不明显。
  3. 索引过多:过多的索引会增加写操作的开销,并占用额外的存储空间。

解决方法

  • 使用EXPLAIN语句查看查询计划,确认索引是否被使用。
  • 优化查询条件,确保使用到索引列。
  • 定期分析和优化索引,删除不必要的索引。

示例代码

代码语言:txt
复制
-- 查看查询计划
EXPLAIN SELECT * FROM users WHERE username = 'john_doe';

-- 如果发现索引未被使用,可以尝试优化查询条件
EXPLAIN SELECT * FROM users WHERE username = 'john_doe' AND age > 25;

参考链接

通过以上信息,您可以更好地理解MySQL中索引的概念、优势、类型、应用场景以及常见问题及其解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mysql 如何索引_mysql如何添加索引

mysql添加索引的方法:可以通过【create table】语句来添加,如【CONSTRAINT PRIMARY KEY | INDEX [] [] 】,表示创建一般索引。...在mysql中可以在创建(CREATE TABLE)的同时创建索引;也可以在创建创建索引,使用CREATE INDEX语句或ALTER TABLE 语句。...(视频教程推荐:mysql视频教程) 1、使用CREATE INDEX语句 可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的创建索引,但该语句不能创建主键。...而当主键是由多个列组成的多列索引,则不能使用这种方法,只能用在语句的最后加上一个 PRIMARY KRY(,…) 子句的方式来实现。...(,…) 4、创建外键索引ADD FOREIGN KEY [] (,…) 示例1:创建一个 tb_stu_info3后,在该的 id 字段上使用 UNIQUE 关键字创建唯一索引

7.3K20
  • mysql创建索引

    1、索引需要占用磁盘空间,因此在创建索引要考虑到磁盘空间是否足够 2、创建索引需要对表加锁,因此实际操作中需要在业务空闲期间进行 SELECT * FROM table_name WHERE...在已存在的中,可以使用ALTER TABLE语句或者CREATE INDEX语句创建索引 在已存在的中,索引创建语句结构 1.普通索引(Normal): ALTER TABLE 名 ADD INDEX...UNIQUE INDEX 索引名 ON 名(列名); 唯一索引的特点: 一个中,可以有多个唯一索引 查询效率高 如果在某一列建立唯一索引,必须保证这列不能有重复数据 如果一个唯一索引上指定...not null,等价于主键索引 3.单列索引: ALTER TABLE 名 ADD INDEX 索引名(列名); 或 CREATE INDEX 索引名 ON 名(列名); 4.组合索引: ALTER...,因此会占用存储空间,一般来说,索引占用的空间的数据的1.5倍;索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据的修改操作(删除,添加,修改)的效率,因为在修改数据的同时还需要修改索引

    3.7K40

    存储优化(3)-mongo大索引

    ":-1},"limit":1}} 增加一个索引 bizId,_id 增加索引过程 对于大(该表记录数5亿),建立索引过程涉及到锁,大量的读写操作、数据同步,肯定会影响线上的操作。.../#dbcmd.createIndexes 创建索引后,通过客户端连接,查看执行计划,始终扫描一行。...那是不是因为这个索引是后来的,plan-cache还没有更新的。...总结 最后解决是通过强制索引来避免索引误判,当然也可以将排序改成 sort({bizId:-1,_id:-1}) 这样也不会误判 总结一下: 大索引,需要确保不会block的其他操作,尽量选择空闲时候...,以background方式创建 增加完索引后,需要check索引是否发挥作用,只是通过explain有可能误判,还是需要结合数据库的slowlog来判断 同一个查询数据库也不总是使用一个索引,会根据查询情况进行调整

    2.8K10

    MySQL InnoDB创建索引

    2.代码分析 2.1 建创建索引 假设我们在建创建主键,但是创建一个二级索引,SQL语句形如: CREATE TABLE t (a int, b int, index idx(b)) ENGINE...2.2 重启后创建索引 MySQL重启后,内部索引对象丢失,需要在启动后重新创建相关的索引MySQL重启后首先会将数据字典内的信息进行读取和初始化,然后根据数据字典的信息进行索引创建。...还是以上文的t为例,假设现在MySQL重启,如何在t上构建索引? step1: 创建聚簇索引 无论如何,聚簇索引都会第一个创建。.... // 和建创建索引的流程一致 可以看出,首先我们会打开一个对象,并获取其中的信息。当然,首先会打开系统以查看持久化的信息。...,其实建创建索引和重启后创建索引的本质过程是一样的,只是在前期步骤有所区别,到了真正为某张添加索引的时候,所走的路径可以说是完全一样的,不同情况下创建索引的步骤是殊途同归。

    5.7K30

    mysql为什么索引就能快

    平时我们要优化 mysql 查询效率的时候,最常见的就是给加上合适的索引了,那今天就来聊聊为什么加了索引就快了呢。...mysql 索引其实就是一颗 B+ 树。...谭小谭,公众号:谭某人mysql索引为啥要选择B+树 (下) 也就是说每个至少都有一个主键索引,而且中所有的数据行都是存放在主键索引这个 B+ 树的叶子节点上的。...刚刚有说过,主键索引叶子节点上保存完整的整行记录值,二级索引叶子节点保存主键的值,所以上面这个 t 的数据在 mysql 底层的存储就如下示意图。 ?...select * from t where k > 3 and k < 6; 这就是为什么加了索引后,mysql 查询会变快的原因了,其实刚提到的这个回过程还可以再优化的,就是利用覆盖索引,后面的文章我们再详细说

    2K30

    Oracle 与 MySQL 的差异分析(3):创建索引

    Oracle 与 MySQL 的差异分析(3):创建索引 1.1 命名 l Oracle: 名、字段名、索引名等,不能超过30个字符。...为 0 ,id 会自动 1;如果指定一个较大的 id,那么下次会从这个 id 继续增长。...1.3 索引 整个数据库中,MySQL索引是可以重名的,MySQL 索引级别的,但是 Oracle 索引是不可以重名的,它的索引是数据库级别的。...由于 MySQL 索引的命名是级别的,所以删除索引也要指定名。...MySQL 分区创建索引是本地索引,不支持全局索引创建索引不需要 load 关键字。在分区上一般不创建主键或唯一索引,如果要创建的话,需要包含分区列。

    1.3K21

    MySQL给字符串索引

    MySQL是支持前缀索引的,前缀索引的优势就是占用的空间小,这同时带来的损失是,可能会增加额外的记录扫描次数。...,那这些语句就只能做全扫描 MySQL 是支持前缀索引的,可以定义字符串的一部分作为索引。...默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。...,这次值对了,将这行记录加入结果集; 重复上一步,直到在 idxe2 上取到的值不是’zhangs’,循环结束。...有以下2中方式 就是使用倒序存储,比如身份证倒序,查询的时候再用函数转一下 以及使用hash字段,在创建一个整数字段,来保存身份证的校验码,同时在这个字段上索引 这两种方式对比区别 从占用的额外空间来看

    2.2K71

    mysql查询索引_MySQL查看表索引

    mysql> show index from tblname; mysql> show keys from tblname; · Table 的名称。...· Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · Seq_in_index 索引中的列序列号,从1开始。...· Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 · Cardinality 索引中唯一值的数目的估计值。...基数根据被存储为整数的统计数据来计数,所以即使对于小型,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。...· Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。 · Packed 指示关键字如何被压缩。如果没有被压缩,则为NULL。

    6.8K40

    mysql5.7 创建提示时间戳非法

    # 背景 mysql版本5.7.8,需要创建,研发提供的sql文件,执行后报错如下: ERROR 1067 (42000): Invalid default value for 'deleted_at...' 就猜测到时因为5.7版本的mysql默认的时间戳不允许输入0000-00-00 00:00:00这种格式,之前碰到过类似问题,需要修改配置 查看了研发提供的sql文件,果真如此: ‘create_at...不希望修改配置文件,通过修改sql_model就可以了的,这种对新建生效 SELECT @@sql_mode; 可查看sql_model,其中NO_ZERO_IN_DATE,NO_ZERO_DATE就是导致...5.7+版本无法输入0的时间戳 NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零  NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告

    1.5K60

    MySQL 创建索引索引效率验证

    索引可以通过层层的筛选,快速精确地定位到指定的数据,避免了查询数据的全扫描。这种定位速度是数量级的速度,数据量越大,效果越明显。...当数据量达到十万条,查询所有数据,也花了一些时间。 4. 给数据创建索引 使用 create index 索引名 on 名(字段名称(长度)); 来创建索引。...创建索引后,查看索引,可以看到刚创建索引信息。 5. 删除索引 使用 drop index 索引名 on 名; 来删除索引。...开启 MySQL 运行时间监测 使用 set profiling=1; 开启 MySQL 运行时间检测,通过运行时间来对比有无索引的效率。...没有创建索引查询 select * from Phone_table where pid=77777; ? 从查询结果下面的时间可以看出是0.04秒。 3.

    3K30

    Innodb索引,这个时候会锁吗?

    索引创建为例: image.png 从上文可见,当我们创建、删除或重命名索引,会采用“in place”的模式。...例如,在添加索引,如果中存在大量未提交的事务,则需要等待这些事务提交后才能开始索引构建。因此,建议在非高峰时段进行此类操作,以避免影响用户的正常使用。...对临时进行重命名操作,并创建索引,完成 DDL 操作。 INPLACE 算法原理 INPLACE 算法是在 MySQL 5.5 中引入的,旨在优化索引创建和删除过程的效率。...其原理是尽可能地使用原地算法进行 DDL 操作,而不是重新创建或复制表。 创建索引数据字典。 对原共享 MDL 锁,阻止对原的写操作,只允许查询操作。...Prepare 阶段: 创建临时 frm 文件。 EXCLUSIVE-MDL 锁,阻止读写操作。

    41410

    oracle创建索引的sql语句_mysql创建组合索引

    创建索引一般分为在线索引和非在线索引,在线与非在线的区别:非在线锁,优先创建索引,此时DML都被阻塞,所以快;相反,在线锁的是行而非,通过临时进行索引创建,所以不会影响DML操作,但副作用就是慢...如果在生产环境操作,不停服务的话,势必导致创建索引期间仍有DML操作进来。另外如果是大,那么采用非在线而导致锁所带来的影响可能会很大。一句话,生产环境不停服的脚本操作,建议使用online。...1、创建索引。...DROP INDEX 索引名; 4、查看某个索引名需大写。 SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '名' 5、查看某个哪些列有索引。...SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = '名' 如果在where 子句中有OR 操作符或单独引用复合索引列的后面列则将不会走索引,将会进行全扫描

    3.8K20
    领券