问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql有几种索引类型?使用索引时都有那些地方要注意?sql优化原则是什么...

发布网友 发布时间:2022-04-24 06:18

我来回答

2个回答

热心网友 时间:2022-04-07 16:21

mysql的索引类型及使用索引时的注意事项有:

一、普通索引。这是最基本的索引,它没有任何*。它有以下几种创建方式:

1、创建索引

代码如下:

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

2、修改表结构

代码如下:

ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 创建表的时候直接指定

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   INDEX [indexName] (username(length))   ); 

-- 删除索引的语法:

DROP INDEX [indexName] ON mytable;

二、唯一索引。它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

代码如下:

CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- 修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- 创建表的时候直接指定
CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   UNIQUE [indexName] (username(length))   );

三、主键索引。它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

代码如下:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID)   );

当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

四、组合索引。为了形象地对比单列索引和组合索引,为表添加多个字段:

代码如下:

CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   city VARCHAR(50) NOT NULL,   age INT NOT NULL  ); 

为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

代码如下:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]
建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:usernname,city,age   usernname,city   usernname  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:

[code]
SELECT * FROM mytable WHREE username="admin" AND city="郑州"  SELECT * FROM mytable WHREE username="admin"

热心网友 时间:2022-04-07 17:39

大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的操作会导致很多慢查。举例来说:

select  * from  tab where a=1 and b=2;


场景 1 

符合 a=1的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建idx_a(a),sql 请求通过索引idx_a访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2的记录。这个动作会导致慢查。如果创建组合索引idx_ab(a,b),sql 请求通过索引idx_ab可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。

场景 2 

符合 a=1的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。


Tips:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 特别搞笑的句子有哪些? MySQL索引使用限制有哪些 最近流行的词(特搞笑)是什么? mysql有几种索引类型?使用索引时都有那些地方要注意 求经典特搞笑的笑话 mysql “索引”能重复吗?“唯一索引”与“索引”区别是什么? 求搞笑简短口头禅。 Mysql索引生效条件是什么? 有没有什么特搞笑的喜剧片? 我想知道这个上学的孩子叫什么?特搞笑的头像 求10个特搞笑的笑话 求农村搞笑头像 求卡通情侣头像,特萌特搞笑的那种。尽量多一点,谢谢 求奥特曼动态搞笑头像 你们有没有那种特别搞笑的头像 你有哪些又傻气又好笑的头像? 服装导购员的工作总结与计划 怎样写店铺的人,货,场这三方面来做工作总结 服装销售的工作总结要怎么写? 2021年砖厂发砖开票年终总结怎样写 中国拒绝特蕾莎修女的原因是什么? 简述一下mysql的索引匹配规则,有哪些常用的mysql优化方案 什么电影超搞笑? 如何幽默调侃头像很丑 MySql是怎么使用的索引,在哪些情况下会使用 解释mysql中什么是索引?它的作用是什么? 手机桌面怎么设置显示时间和天气? mysql索引? mysql索引优化的规则注意事项 常见降三高的方法有哪些? MySQL的btree索引和hash索引的区别 快速降高血压的方法有哪些? 怎么降低身高啊? 手机怎么设置桌面显示天气和时间? 怎样降三高 vivo手机无法root怎么办? 怎样才能降三高 降三高最有效的方法 怎样降高血压 降三高的正确方法