mysql 什么时候用单列索引?什么使用用联合索引预见数据量会比较大的情况下,如果您经常需要用单列作为筛选条件查询数据或者要求某列不得有重复,那么就请创建单列索引;如果您经常组合使用多列作为筛选条件或要求多列的组合不得有重复,那么就应该创建多列索引 。另外需要建立表间关系约束的情况下,主表需要以一个字段与子表关联的,应创建单字段索引,而主表需要以多个字段的组合与子表关联的,则应该使用联合索引 。
注意:索引不是全部都需要显式添加的,某字段或多个字段的组合一旦被设置为主键,又或者子表被建立与主表的表间关系后,那么系统会自动为相应的字段或字段组合添加索引,这种情况下我们就不必多此一举为相应的字段再添加索引了 。
mysql索引的创建和使用我们可以通过查看索引的属性来判断创建索引的方法 。
查看索引的语法格式如下:
SHOW INDEX FROM 表名 [ FROM 数据库名]
语法说明如下:
表名:指定需要查看索引的数据表名 。
数据库名:指定需要查看索引的数据表所在的数据库,可省略 。比如,SHOW INDEX FROM student FROM test; 语句表示查看 test 数据库中 student 数据表的索引 。
示例
使用 SHOW INDEX 语句查看《MySQL创建索引》一节中 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)
其中各主要参数说明如下:
参数 说明
Table 表示创建索引的数据表名,这里是 tb_stu_info2 数据表 。
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 显示评注 。
MySQL单列索引和组合索引的区别详解MySQL单列索引和组合索引mysql单列索引怎么用的区别可能有很多人还不是十分的了解下面就为您分析两者的主要区别供您参考学习
为了形象地对比两者再建一个表
CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT vc_Name VARCHAR() NOT NULL vc_City VARCHAR() NOT NULL i_Age INT NOT NULLi_SchoolID INT NOT NULL PRIMARY KEY (i_testID) );
在这条记录里面上下地分布了条 vc_Name="erquan" 的记录只不过 cityageschool 的组合各不相同
来看这条 TSQLSELECT i_testID FROM myIndex WHERE vc_Name=erquanAND vc_City=郑州 AND i_Age=;
首先考虑建MySQL单列索引
在 vc_Name 列上建立了索引执行 TSQL 时MYSQL 很快将目标锁定在了 vc_Name=erquan 的条记录上取出来放到一中间结果集在这个结果集里先排除掉 vc_City 不等于"郑州"的记录再排除 i_Age 不等于的记录最后筛选出唯一的符合条件的记录
虽然在 vc_Name 上建立了索引查询时MYSQL不用扫描整张表效率有所提高但离mysql单列索引怎么用我们的要求还有一定的距离同样的在 vc_City 和 i_Age 分别建立的MySQL单列索引的效率相似
为了进一步榨取 MySQL 的效率就要考虑建立组合索引就是将 vc_Namevc_Cityi_Age 建到一个索引里
ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name()vc_Cityi_Age);
建表时vc_Name 长度为 这里为什么用呢mysql单列索引怎么用?因为一般情况下名字的长度不会超过 这样会加速索引查询速度还会减少索引文件的大小提高 INSERT 的更新速度
执行 TSQL 时MySQL 无须扫描任何记录就到找到唯一的记录?。?
肯定有人要问了如果分别在 vc_Namevc_Cityi_Age 上建立单列索引让该表有个单列索引查询时和上述的组合索引效率一样吗?大不一样远远低于我们的组合索引虽然此时有了三个索引但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引
建立这样的组合索引其实是相当于分别建立了
vc_Namevc_Cityi_Age
vc_Namevc_City
vc_Name
这样的三个组合索引!为什么没有 vc_Cityi_Age 等这样的组合索引呢?这是因为 mysql 组合索引“最左前缀”的结果简单的理解就是只从最左面的开始组合并不是只要包含这三列的查询都会用到该组合索引下面的几个 TSQL 会用到
SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_Name="erquan"
而下面几个则不会用到
SELECT * FROM myIndex WHREE i_Age= AND vc_City="郑州"
SELECT * FROM myIndex WHREE vc_City="郑州"
mysql 主键索引,联合索引,单列索引使用场景表button
CREATE TABLE `button` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,--主键索引
`button_name` varchar(45) NOT NULL COMMENT '功能名称',
`app_id` bigint(20) NOT NULL,
`permission_id` bigint(20) DEFAULT NULL,-- permission_id 和 app_id 联合索引 。
`api_id` bigint(20) NOT NULL, --api_id单独索引
PRIMARY KEY (`id`),
KEY `index_app_permission_lianhe` (`permission_id`,`app_id`) USING BTREE,
KEY `index_api_id_dange` (`api_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
主键索引,单独索引,组合索引使用场景及优化
表button 有3个索引,分别是:id主键,联合索引(permission_id,app_id) , api_id(单列索引)
button_name 无索引
查询where条件中:
主键索引:
1、主键索引与联合索引同时存在,使用主键索引
2、主键索引与单个索引同时存在,使用主键索引
结论:只要主键索引在,使用主键索引 。
联合索引 :
1、联合索引与单列索引列 同时存在,使用单列索引
2、联合索引中列顺序颠倒无影响 。
3、联合索引实行最左侧原则,即:单独查询条件中只有permission_id可以使用联合索引,单独查询条件中只有app_id不实用联合索引 。
4、如果查询条件中只有app_id,但是select 条件中有 permission_id,则也使用联合索引 。
5、select id,app_id from button where app_id=1001; 使用联合索引
6、explain select id,app_id,button_name from button where app_id=1001;不使用联合索引
结论:索引优先级:主键索引 , 单列索引 , 组合索引
联合索引中遵从最左侧列原则 。
当查询条件和返回结果中仅仅包含联合索引中索引项,也使用联合索引 。如第4条 。
当查询条件中出现联合索引中非最左侧索引列,返回结果中含义联合索引中的列或者主键则也使用联合索引 。
单个索引:
1、查询条件中有单列索引,则使用,无不使用 。
事例:
「进阶」MySQL中如何使用索引1、普通索引
这是最基本mysql单列索引怎么用的索引mysql单列索引怎么用,它没有任何限制 。
2、唯一索引
它与前面的普通索引类似mysql单列索引怎么用,不同的就是:索引列的值必须唯一,但允许有空值 。如果是组合索引,则列值的组合必须唯一 。
3、主键索引
它是一种特殊的唯一索引,不允许有空值 。一般是在建表的时候同时创建主键索引 。
4、聚簇索引
聚簇索引的索引顺序就是数据存储的物理存储顺序,这样能保证索引值相近的元组所存储的物理位置也相近 。
5、全文索引(FULLTEXT)
全文索引只能创建在数据类型为VARCHAR或TEXT的列上,建立全文索引后,能够在建立mysql单列索引怎么用了全文索引的列上进行全文查找 。全文索引只能在MyISAM存储引擎的表中创建 。
实际工作使用中,索引可以建立在单一列上,称为单列索引 , 也可以建立在多个列上,称为组合索引 。
MySQL索引机制(详细 原理 解析)MySQL 前缀索引能有效减小索引文件的大?。?提高索引的速度 。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引 , 也不能把它们用作覆盖索引(Covering Index) 。
集一个索引包含多个列(最左前缀匹配原则)
索引列的值必须唯一 , 但允许有空值
全文索引为FUllText,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值,全文索引可以在CHAR,VARCHAR,TEXT类型列上创建
设定主键后数据会自动建立索引,InnoDB为聚簇索引
即一个索引只包含单个列,一个表可以有多个单列索引
覆盖索引是指一个查询语句的执行只用从所有就能够得到 , 不必从数据表中读?。哺撬饕皇撬饕? ,是一个结果,当一条查询语句符合覆盖索引条件时候 , MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后的回表操作,减少了I/O效率
查看索引
列名解析:
删除索引
查看:
删除前:
删除后:
普通的索引,没有什么介绍
查看:(注意和前缀索引Sub_part的区别)
当索引的列是unique的时候 , 会生成唯一索引,唯一索引关于null有下列两种情况
SQLSERVER 下的唯一索引的列,允许null值,但最多允许有一个空值
MYSQL下的唯一索引的列,允许null值 , 并且允许多个空值
查看:
会建立两个索引,一个非聚簇索引,一个是唯一索引
结果:
可以插入两个空值(明人不说暗话,我喜欢MySQL)
一方面,它不会索引所有字段所有字符,会减小索引树的大小.
另外一方面,索引只是为了区别出值,对于某些列,可能前几位区别很大 , 我们就可以使用前缀索引 。
一般情况下某个前缀的选择性也是足够高的,足以满足查询性能 。对于BLOB,TEXT,或者很长的VARCHAR类型的列 , 必须使用前缀索引,因为MySQL不允许索引这些列的完整长度 。
查看:
查看:
复合索引的最左前缀匹配原则 :
对于复合索引,查询在一定条件才会使用该索引
减少开销 。建一个联合索引(col1,col2,col3) , 实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引 。每多一个索引,都会增加写操作的开销和磁盘空间的开销 。对于大量数据的表,使用联合索引会大大的减少开销!
覆盖索引 。对联合索引(col1,col2,col3) , 如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2 。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作 。减少io操作,特别的随机io其实是dba主要的优化策略 。所以,在真正的实际应用中 , 覆盖索引是主要的提升性能的优化手段之一 。
效率高 。索引列越多,通过索引筛选出的数据越少 。有1000W条数据的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假设假设每个条件可以筛选出10%的数据 , 如果只有单值索引,那么通过该索引能筛选出1000W10%=100w条数据,然后再回表从100w条数据中找到符合col2=2 and col3= 3的数据 , 然后再排序,再分页;如果是联合索引,通过索引筛选出1000w10% 10% *10%=1w 。
在模糊搜索中很有效 , 搜索全文中的某一个字段,可以参考这篇博文
:
我们先进行下面一个实验看看InnoDB下的主键索引的一个现象 。
【mysql单列索引怎么用 新课堂健康校园心理健康观后感】 查看:
我们插入进去的时候,数据的id都是乱序的,为什么这里最后select查询出来的结果都是进行了排序?
这是因为InnoDB索引底层实现的是B tree,B tree具有下列的特点:
所以上面的排序是为了使用B tree的结构 ,B tree为了范围搜索,将主键按照从小到大排序后,拆分成节点 。后续还有新的节点进入的时候,和B-tree相同的操作,会进行分裂 。
一般来说 , 聚簇索引的B tree都是三层
InnoDB中主键索引一定是聚簇索引,聚簇索引一定是主键索引 。
为什么这里辅助索引叶子结点不直接存储数据呢?
MYISAM只有非聚簇索引,索引最终指向的都是物理地址 。
Q:既然有回表的存在,那么聚簇索引的优势在哪里?
Q:主键索引作为聚簇索引需要注意什么
在查询语句中使用LIke关键字进行查询时,如果匹配字符串的第一个字符为"%" , 索引不会使用 。如果“%”不是在第一位,索引就会使用
多列索引是在表的多个字段上创建的索引,满足最左前缀匹配原则,索引才会被使用
查询语句只有Or关键字时候,如果OR前后的两个条件都是索引,这这次查询将会使用索引 , 否则Or前后有一个条件的列不是索引,那么查询中将不使用索引
关于mysql单列索引怎么用和新课堂健康校园心理健康观后感的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- python怎么匹配字段,python 如何匹配列表中某个单词
- 背景墙挂电视怎么弄,电视背景墙挂装电视
- jquery开发教程培训教程,jquery教程入门
- 什么叫cpu文字,如何理解cpu的字长
- vb.net向导窗体 vbnet main启动窗体
- 电商群发短信如何营销自己的简单介绍
- 关于支付宝的小程序可以转卖吗的信息
- wps文档pdf格式文件怎么打开,wps pdf文档怎么打开
- oracle如何添加任务 oracle添加用户命令