- 浏览: 209749 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
一、索引分类
1.单列索引:一个索引包含一列,一个表可以包含多个单列索引;分为:
2.组合索引:一个组合索引包含两个或两个以上的列
二、索引创建、删除
1.创建索引
2.删除索引
3.查看索引
三、存储引擎:InnoDB,基于BTree索引,最左匹配原则,以组合索引为例:
1.建表
2.最左匹配原则, a_b_c_index(a,b,c) 匹配 a , b , abc 三种索引,组合查询时查询条件应与索引顺序大致相同
MySQL有查询优化器,会自动将查询条件按照索引的顺序进行执行;但最好是按照索引的顺序排列查询条件,便于使用查询缓存;mysql查询缓存配置和查看
且SQL查询中保持大小写一致,不要既有大写又有小写的
-- 查询时使用到索引
-- 查询时使用不到索引
3.范围查询 like
4.索引范围查询与位置有关,若最左侧的字段使用范围查询将导致组合索引中后续的字段在索引中失效;后面的字段同样,第二个字段按照范围查询,则第三个至最后一个的字段索引失效
根据范围进行查询,索引依然可以用到,但通过ref 为null 可知,查询效率要低好多
另外,>= 与 > 在使用上有区别,前者可用到全部的索引字段,后者只能用到当前字段左侧的所有字段
5.单独使用order by 索引,不起作用;必须配合 where 条件共同使用
a.未使用到索引的情况
b.使用了索引的情况
6.
四、explain
1.如何判断是否使用到了索引?
type = all 全表检索
possible_keys 可能使用到的索引
key 使用到的索引
key_len 索引长度
2.如何判断使用到的索引的字段个数?key_len
key_len长度的计算
博文参考:
MySQL中计算索引长度
五、索引优点
1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
2.建立索引可以大大提高检索的数据,以及减少表的检索行数
3.在表连接的连接条件 可以加速表与表直接的相连
4.在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
5.建立索引,在查询中使用索引 可以提高性能
六、索引缺点
1.在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。
(在某个字段建立索引后,会开辟一段物理空间存放该字段中的元素按照BTREE的数据结构,当数据新增、更新、删除后, BTree结构 需要重新变更,故后期维护需要一定的成本)
七、注意事项
1.在经常需要搜索的列上,可以加快索引的速度
-- 开发过程中将使用的SQL依次列出,然后按照查询条件共同使用的字段,添加索引
2.主键列上可以确保列的唯一性
-- 主键,若为int类型,需指定 unsigned 无符号, primary key auto_increment 自增
3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit)
-- 多表关联查询,当索引的顺序与ORDER BY中的列顺序相同且所有的列是同一方向(全部升序或者全部降序)时,可以使用索引来排序。如果查询是连接多个表,仅当ORDER BY中的所有列都是第一个表的列时才会使用索引。其它情况都会使用filesort。
5.在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)
-- >= 与 > 有一定区别,组合索引中,最左字段使用>= 依然可以使用整个索引;但 > 将导致其右侧字段索引失效
6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick '%ABC%' 那么这个索引讲不会起到作用.而nickname lick 'ABC%' 那么将可以用到索引
7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串
-- 索引不包含NULL,指的是该列的内容中不可以包含NULL,字段本身可以为NULL,计算key_len时为NULL的字段需要加一个字节
8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.
9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快
八、不使用索引
1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
-- 即区分度不高的字段不使用索引
3.定义为text和image和bit数据类型的列不应该增加索引,
4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
博文转载:
细说mysql索引
博文参考:
理解MySQL——索引与优化
1.单列索引:一个索引包含一列,一个表可以包含多个单列索引;分为:
- 普通索引
- 主键索引
- 唯一索引:与主键索引相似,区别:可以为NULL,主键索引不可以
2.组合索引:一个组合索引包含两个或两个以上的列
二、索引创建、删除
1.创建索引
-- 索引类型:primary key 主键索引、UNIQUE INDEX 唯一索引、INDEX 普通索引、组合索引; -- 索引名称:见名知意,不易过长;唯一索引 unique_index_column_name 、组合索引 a_b_c_d 依次列出字段名称 union_index ; 普通索引 index_(idx_简写为) -- 创建索引 create INDEX index_name on table_name(column_name); CREATE INDEX account_Index ON `award`(`account`); -- 注意字段上的符号 alter table table_name add INDEX index_name(column_name); ALTER TABLE award ADD INDEX account_Index(`account`);
2.删除索引
DROP INDEX IndexName ON `TableName`;
3.查看索引
show INDEX from `TableName`;
三、存储引擎:InnoDB,基于BTree索引,最左匹配原则,以组合索引为例:
1.建表
show databases ; -- 显示数据库 use test ; -- 使用 test 数据库 show tables ; -- 显示数据库中的数据表 CREATE TABLE `award` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', `aty_id` varchar(100) NOT NULL DEFAULT '' COMMENT '活动场景id', `nickname` varchar(12) NOT NULL DEFAULT '' COMMENT '用户昵称', `is_awarded` tinyint(1) NOT NULL DEFAULT 0 COMMENT '用户是否领奖', `award_time` int(11) NOT NULL DEFAULT 0 COMMENT '领奖时间', `account` varchar(12) NOT NULL DEFAULT '' COMMENT '帐号', `password` char(32) NOT NULL DEFAULT '' COMMENT '密码', `message` varchar(255) NOT NULL DEFAULT '' COMMENT '获奖信息', `created_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间', `updated_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='获奖信息表'; desc award ; -- 查看表结构 show columns from award ; -- 查看表结构 alter table award add index nickname_account_create_time(nickname,account,created_time); -- 添加索引,组合索引
2.最左匹配原则, a_b_c_index(a,b,c) 匹配 a , b , abc 三种索引,组合查询时查询条件应与索引顺序大致相同
MySQL有查询优化器,会自动将查询条件按照索引的顺序进行执行;但最好是按照索引的顺序排列查询条件,便于使用查询缓存;mysql查询缓存配置和查看
且SQL查询中保持大小写一致,不要既有大写又有小写的
-- 查询时使用到索引
-- 匹配a explain select * from award where nickname = "1" ;
-- 匹配ab explain select * from award where nickname = "1" and account = "2" ;
-- 匹配abc explain select * from award where nickname = "1" and account = "2" and created_time = "2017-10-01";
-- 查询时使用不到索引
-- 最左匹配原则,虽然组合索引中包含account 字段,但并不匹配它 explain select * from award where account = "2" ;
3.范围查询 like
-- 可以使用 explain select * from award where nickname like "1" ; -- 不可以 explain select * from award where nickname like "%1%" ; -- "%1" 同样 -- 可以 explain select * from award where nickname like "1%" ; -- 最左匹配,最左侧不可以为模糊的数据
4.索引范围查询与位置有关,若最左侧的字段使用范围查询将导致组合索引中后续的字段在索引中失效;后面的字段同样,第二个字段按照范围查询,则第三个至最后一个的字段索引失效
根据范围进行查询,索引依然可以用到,但通过ref 为null 可知,查询效率要低好多
另外,>= 与 > 在使用上有区别,前者可用到全部的索引字段,后者只能用到当前字段左侧的所有字段
5.单独使用order by 索引,不起作用;必须配合 where 条件共同使用
a.未使用到索引的情况
b.使用了索引的情况
6.
四、explain
1.如何判断是否使用到了索引?
type = all 全表检索
possible_keys 可能使用到的索引
key 使用到的索引
key_len 索引长度
2.如何判断使用到的索引的字段个数?key_len
key_len长度的计算
- 所有的索引字段,如果没有设置not null,则需要加一个字节。
- 定长字段,int占四个字节、date占三个字节、char(n)占n个字符。
- 对于变成字段varchar(n),则有n个字符+两个字节。
- 不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。
-- 三个索引字段 `nickname` varchar(12) NOT NULL DEFAULT '' COMMENT '用户昵称', `account` varchar(12) NOT NULL DEFAULT '' COMMENT '帐号', `created_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', -- 按照上述的计算方式: -- 使用了a索引:key_len = 12 * 3 + 2 = 38 -- 使用了ab索引:key_len = 24 * 3 + 2*2 = 76 -- 使用了abc索引:key_len = 24*3 + 2*2 + 4 = 80
博文参考:
MySQL中计算索引长度
五、索引优点
1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
2.建立索引可以大大提高检索的数据,以及减少表的检索行数
3.在表连接的连接条件 可以加速表与表直接的相连
4.在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
5.建立索引,在查询中使用索引 可以提高性能
六、索引缺点
1.在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。
(在某个字段建立索引后,会开辟一段物理空间存放该字段中的元素按照BTREE的数据结构,当数据新增、更新、删除后, BTree结构 需要重新变更,故后期维护需要一定的成本)
七、注意事项
1.在经常需要搜索的列上,可以加快索引的速度
-- 开发过程中将使用的SQL依次列出,然后按照查询条件共同使用的字段,添加索引
2.主键列上可以确保列的唯一性
-- 主键,若为int类型,需指定 unsigned 无符号, primary key auto_increment 自增
3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit)
-- 多表关联查询,当索引的顺序与ORDER BY中的列顺序相同且所有的列是同一方向(全部升序或者全部降序)时,可以使用索引来排序。如果查询是连接多个表,仅当ORDER BY中的所有列都是第一个表的列时才会使用索引。其它情况都会使用filesort。
5.在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)
-- >= 与 > 有一定区别,组合索引中,最左字段使用>= 依然可以使用整个索引;但 > 将导致其右侧字段索引失效
6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick '%ABC%' 那么这个索引讲不会起到作用.而nickname lick 'ABC%' 那么将可以用到索引
7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串
-- 索引不包含NULL,指的是该列的内容中不可以包含NULL,字段本身可以为NULL,计算key_len时为NULL的字段需要加一个字节
8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.
9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快
八、不使用索引
1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
-- 即区分度不高的字段不使用索引
3.定义为text和image和bit数据类型的列不应该增加索引,
4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
博文转载:
细说mysql索引
博文参考:
理解MySQL——索引与优化
发表评论
-
索引相关(二)
2017-11-05 21:13 497索引相关 一、InnoDB 与 MyISAM 对比 存储引 ... -
SQL优化示例
2017-11-03 15:34 478一、distinct 、 union all 、 union ... -
检索指定时间范围内的数据与预期不一致
2017-10-30 20:38 565问题背景: 在不同日期内进行不同的业务逻辑,在测试环境进行模拟 ... -
存储引擎InnoDB与MyISAM区别
2017-10-29 17:26 376存储引擎 一、总结 名称MyISAMInnoDB事务不支持支 ... -
常用索引优化
2017-10-29 16:07 384唯一索引 联合索引 索引方式:BTREE 1.order b ... -
统计每天的数据
2017-10-10 21:23 543需求:按天统计数据 分析:create_time 为 dat ... -
DDL - CREATE
2017-08-05 06:10 483一、基本语句 CREATE TABLE `data_te ... -
数据统计
2016-06-12 17:04 556按照时间统计各个阶段的数据数量 1.统计每个月卖家的注册数量 ... -
1030 Got error 28 from storage engine
2016-05-24 22:25 1318现象:调试程序过程中,突然报错,显示数据检索失败,数据库连接超 ... -
批量数据修改
2015-08-19 15:39 439问题:增加新功能,需要初始化数据,执行update、inser ... -
mysql 如何查询出某字段的值不为空的数据
2015-06-30 19:05 2904问题:查询原有某类数据的数量,对比发现,新旧数据的差距是新插入 ... -
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException
2015-05-21 15:38 840异常: com.mysql.jdbc.exceptions.j ... -
You can't specify target table <tbl> for update in FROM clause
2015-04-23 10:50 729[size=large][/size] mysql中You ... -
MySQL-删除除id外其他内容都相同的数据
2015-04-23 09:24 1095删除除id外其他内容都相同的数据 难点:自己不能删除自己,要 ... -
MySQL常用操作总结
2015-04-23 08:32 540常用数据表操作: 虽然有DBA的存在,但PD(program ...
相关推荐
标题中的“hadoop 索引相关记录”指的是在Hadoop MapReduce框架中与数据索引相关的技术。Hadoop是一个开源分布式计算框架,主要用于处理和存储大规模数据集。MapReduce是其核心计算模型,它将大数据处理任务分解为两...
这个压缩包文件“安卓A-Z字母排序索引相关-按字母索引滑动.zip”似乎包含了实现这一功能的相关资源和代码示例。 首先,我们看到一个名为“142432jmrmcrgrt77orczn.png”的图片文件,这可能是一个示例界面的截图,...
在给定的压缩包文件"安卓A-Z字母排序索引相关-字母索引搜索ListView.rar"中,可能包含了实现这一功能的相关源码和资源。 首先,"LetterFilterListView"可能是项目的核心类,它扩展了Android的默认ListView,添加了...
【标题】"安卓A-Z字母排序索引相关-ListviewFilter-master(listView右侧字母索引)"涉及的是在Android开发中,如何实现ListView的快速索引功能。这种功能常见于通讯录应用,用户可以通过左侧或右侧的字母栏快速定位到...
总结起来,使用Elasticsearch和JavaWeb技术实现关键词索引相关文章内容,主要涉及以下步骤: 1. 添加Elasticsearch和Jest相关依赖。 2. 创建Elasticsearch客户端连接。 3. 实现文章内容的索引和查询方法。 4. 考虑...
这个压缩包文件"安卓A-Z字母排序索引相关-IndexableListView索引导航.zip"包含了一些资源和源码,可能用于演示或学习如何在Android应用中实现这种索引导航。 首先,我们来看`IndexableListView`的核心概念。它是对...
【MySQL日志与索引相关问题详解】 在MySQL数据库中,日志系统是确保数据完整性和高可用性的重要组成部分。本文将围绕日志系统,特别是binlog(归档日志)和redo log(重做日志)在崩溃恢复中的作用进行深入探讨。...
"电信设备-一种获取索引相关信息的方法和设备.zip"这个压缩包文件显然聚焦于一个特定的技术领域,即电信设备如何通过创新的方式获取和处理索引信息。下面将详细探讨这个主题。 首先,我们要理解“索引相关信息”在...
这个"安卓A-Z字母排序索引相关-IndexableListView实现带字母索引效果的listview列表.rar"文件似乎提供了一个实现这种效果的解决方案。下面将详细解释这种效果的实现原理以及可能涉及的关键知识点。 首先,`...
本资源"安卓A-Z字母排序索引相关-AndroidListView侧栏字母条索引定位.rar"主要涉及如何在ListView中实现这种功能,即侧栏字母条索引定位。 首先,我们需要理解ListView的工作原理。ListView通过Adapter(适配器)将...
本资源"安卓A-Z字母排序索引相关-类似微信按照字母排列listview的item.rar"提供了实现这一功能的相关代码示例,虽然未经过全面验证,但可以作为开发者参考和学习的基础。 首先,我们需要理解ListView在Android中的...
公司内部培训-MySQL索引相关
这个压缩包文件“安卓A-Z字母排序索引相关-通讯录按首字母排列关键字查找.rar”可能包含了一系列示例代码或教程,用于帮助开发者理解和实现这一功能。下面将详细讲解通讯录按首字母排列以及关键字查找的相关知识点。...
本教程将围绕"安卓A-Z字母排序索引相关-拼音检索ListView实现拼音检索ListView的简单功能"这一主题展开,讲解如何实现这个功能。 首先,我们需要理解拼音检索的核心是将中文转换为对应的拼音,以便与A-Z字母表进行...
本压缩包文件提供了关于如何创建一个可点击的字母索引列表,用于快速定位到以特定字母开头的联系人列表的相关资源。 首先,我们来理解"联系人类型的右侧字母索引列表"这一概念。这是在安卓应用中常见的一种设计,...
`.pbl`可能是索引的定义文件,`.pbt`可能包含索引的元数据,而`.pbw`可能是与索引相关的权重或其他配置信息。这些文件的具体用途取决于它们所属的软件系统。 总的来说,文件索引的创建是提升系统性能的重要手段,...
模仿微信联系人的字母索引ListView,高拓展,高维护。.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
### 创建数据库表与索引实验知识点总结 #### 一、实验背景与目标 **实验标题:** 创建数据库表与索引实验 **实验描述:** 本次实验旨在让学生掌握...这些技能对于今后从事数据库相关的开发和管理工作都至关重要。
### SQL Server 建立索引相关知识点 #### 一、建立索引 索引是在数据库表中的数据列上创建的一种特殊的数据结构,其目的是为了加快数据检索速度。索引类似于书籍的目录,通过索引可以快速定位到所需的数据行,从而...