Mysql多列索引经典案例】的更多相关文章

一个经典的多列索引案例,如题: 假设某个表有一个联合索引(c1,c2,c3,c4)一下--只能使用该联合索引的 c1,c2,c3 部分 Awhere c1=x and c2=x and c4>x and c3=x B where c1=x and c2=x and c4=x order by c3 C where c1=x and c4= x group by c3,c2 D where c1=x and c5=x order by c2,c3 E where c1=x and c2=x and…
数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用索引(通常是where条件匹配索引)就会利用树的结构加快查找,索引会按值查找到要查找的行在表中位置,不需回表查询数据的就是聚簇索引(索引和数据存放在一起).通常是需要回表再查数据,需要消耗额外的磁盘IO.所以有些时候(如按顺序读取数据)全表扫描会比使用索引快的原因就在于此. 查询条件只有一个字段时,…
转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引:CREATE TABLE test (      id         INT NOT NULL,      last_name  CHAR(30) NOT NULL,      first_name CHAR(30) NOT NULL,      PRIMARY KEY (id),      INDEX name (last_name,first_name)  …
MySQL数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. CREATE TABLE test ( id         INT NOT NULL, last_name  CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) ); 以上创建的其实是一个多列索引,创建列索引的代码如下: CREATE TABLE …
mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要,只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a,b,c..这样排好序的:所以你在找东西的时候才快,比如你找 “中” 这个字的解释,你肯定就会定位到目录的 z 开头部分: 组合索引可以这样理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的: 组合索引的生效原则是  从前往后依次使用生效,如果中…
“把Where条件里面的列都建上索引”,这种说法其实是非常错误的! 这样一个查询,假设actor_id与film_id都单独建立索引 SELECT film_id , actor_id FROM sakila.film_actor ; 在老的mysql版本中,mysql对这个查询会使用全表扫描,除非改写成下面这样 UNION ALL ; 但在mysql 5.0中,查询能够同时使用这两个单列索引进行扫描,并将结果进行合并,通过Explain的Extra列可以看到这点,这种算法有3个变种: 1.OR…
MySQL 5.6.30 问题背景 由于爬虫抓取的数据不断增多,这两天在不断对数据库以及查询语句进行优化,其中一个表结构如下: CREATE TABLE `newspaper_article` ( `id` varchar(50) NOT NULL COMMENT '编号', `title` varchar(190) NOT NULL COMMENT '标题', `author` varchar(255) DEFAULT NULL COMMENT '作者', `date` date NULL D…
在网上看到: 定义:最左前缀原则指的的是在sql where 子句中一些条件或表达式中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要 出现非顺序出现.断层都无法利用到多列索引. 该博文有误 ,暂未修改 2013年11月22日 打算实践一下,但是实践结果却正好相反,最后找出原因. 第一次实践过程如下: /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50515 Sourc…
索引优化 ,b-tree假设某个表有一个联合索引(c1,c2,c3,c4) 以下 只能使用该联合索引的c1,c2,c3部分A. where c1 = x and c2 = x and c4>x and c3 = xB. where c1 = x and c2 = x and c4=x order by c3C. where c1 = x and c4 = x group by c3,c2D. where c1 = ? and c5 = ? order by c2,c3E. where c1 =…
1,数据库每次查询只能使用一个索引 2,假设数据 表T (a,b,c) rowid 为物理位置rowid a b c(1) 1 1 1(2) 2 1 13(3) 2 2 14(4) 1 3 3(5) 2 3 12(6) 1 2 5(7) 2 3 9(8) 1 2 2(9) 1 3 6(10) 2 2 11(11) 2 2 8(12) 1 1 7(13) 2 3 15(14) 1 1 4(15) 2 1 10 当你创建一个索引 create index xxx on t(a,b), 则索引文件逻辑…
https://www.cnblogs.com/codeAB/p/6387148.html…
索引优化策略 :索引类型 .1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用. 注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎稍有不同.比如,严格的说,NDB引擎,使用的是T-tree.Myisam,innodb中,默认用B-tree索引. 凡是tree系列的,可理解为”排好序的.快速查找.的结构”.是排好序的,所以查询某个范围就很快. btree索引的常见误区:在where条件常用的列上都加上索引, 例: ; //查询第…
Sql 经典案例 gb 4.2 ** 1 检索记录 (1) 主要介绍 Sql的基本SELECT查询语句 使用 SELECT * from 表 查询数据 查询该表的每一列数据 * 代表所有的意思 也可以是 SELECT 列1,列2 from 表 (2) 筛选行 有一张表 只想查询满足条件的列的 内容 举例:查询学生 要求年龄大于18 的学生 select * from student where stuage >18 举例: 查询学生 学生姓 李的同学 SELECT * FROM student…
索引使用案例 支持多种过滤条件 假设要设计一个在线约会网站,用户信息表有很多列,包括国家.地区.城市.性别.眼睛颜色,等等.网站必须支持上面这些特征的各种组合来搜索用户,还必须允许根据用户的最后在线时间.其他会员对用户的评分等对用户进行排序并对结果进行限制.如何设计索引满足上面的复杂需求呢? 现在需要看看哪些列选择性更高,哪些列在WHERE 子句中出现得最频繁.country.sex 列的选择性通常不高,但可能很多查询都会用到.所以考虑到使用的频率,建议在创建不同组合索引的时候将(sex,cou…
mysql的多列索引是经常会遇到的问题,怎样才能有效命中索引,是本文要探讨的重点. 多列索引使用的Btree,也就是平衡二叉树.简单来说就是排好序的快速索引方式.它的原则就是要遵循左前缀索引. 多个索引从左边往右都使用上,才能使用到整个多列索引. 下面我先建立一个简单的表做实验: create table t6 ( c1 char(1) not null default '', c2 char(1) not null default '', c3 char(1) not null default…
有一个业务是查询最新审核的5条数据 SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 AND `status` = 'ONLINE' ORDER BY `audit_time` DESC, `id` DESC LIMIT 5; 查看当时的监控情况 cpu 使用率是超过了100%,show processlist看到很多类似的查询都是处于create sort index的状态. 查看该表的结构 CREAT…
索引的三星原则 1.索引将相关的记录放到一起,则获得一星 2.如果索引中的数据顺序和查找中的排列顺序一致则获得二星 3.如果索引中的列包含了查询中的需要的全部列则获得三星 多列索引 1.1.多个单列索引 很多人对多列索引的理解都不够.一个常见的错误就是,为每个列建立独立的索引,或者按照错误的顺序创建多列索引. 我们会在稍后的章节中单独讨论索引列的顺序问题.先来看第一个问题,为每个列创建独立的索引,从SHOW CREATE TABLE 中很容易看到这种情况: CREATE TABLE t( c1…
没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tree索…
#进阶8 分页查询 /* 应用场景: 当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 #7 from 表1 #执行顺序:#1 [join type join 表2 #2 on 连接条件 #3 where 筛选条件 #4 group by 分组字段 #5 having 分组后筛选或函数 #6 order by 排序的字段 #8 ] limit offset, size ; #9 #offset 要显示条目的起始索引(从0开始,0想可以省略),size 要显示的…
前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐含使用排序.本文首先会简单介绍SQL如何利用索引避免排序代价,然后会介绍MySQL实现排序的内部原理,并介绍与排序相关的参数,最后会给出几个"奇怪"排序例子,来谈谈排序一致性问题,并说明产生现象的本质原因. 排序优化与索引使用 为了优化SQL语句的排序性能,最好的情况是避免排序,合理利用索…
阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的<云数据库十大经典案例分析>的分享整理而成.罗龙九以MySQL数据库为例,分析了自RDS成立至今,用户在使用RDS过程中最常见的问题,包括:索引.SQL优化.锁.延迟.参数优化.连接数.CPU.Iops.磁盘.内存等.罗龙九通过对十大经典案例的总结,还原问题原貌,给出分析问题的思路,旨在帮助用户在使用…
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为三个部分. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. 第二部分结合MySQL数据库中My…
初始化测试数据 创建一个测试用的表 create table dept(id int primary key auto_increment , deptName varchar(32) not null unique,salary decimal(12,6) not null,remark varchar(256),createDate date); 在表中插入一万条数据 BEGIN Declare i int default 0; while(i<=10000) do begin select…
索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的.MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化. 一.导致SQL执行慢的原因 1.硬件问题.如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等. 2.没有索引或者索引失效.(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你删除某个数据的时候,索引…
1.前言 本章记录MySQL中的索引机制,了解索引可以让数据库更快.索引太多会造成性能损耗,索引太少肯定查询效率不高. 2.InnoDB存储引擎所有概述 InnoDB中常见的索引有: B+树索引 全文索引 哈希索引 哈希索引是自适应的,无法人为干预是否在一张表中生成hash索引. B+树不能找到一个给定键值的具体行,B+树索引能找到的只是被查找数据所在的页,通过将页读取到内存,再定位数据. 3.数据结构与算法 3.1 二分查找法 二分查找也就是折半查找,前提是有序,该算法算是一个基础算法了,思想…
原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化.最基本的查询算法当然是顺序查找(linear searc…
索引永远是最好的查询解决方案嘛? 索引并不总是最好的工具.总的来说,只有当索引帮助存储引擎快速查找到记录带来的好处大于其带来的额外工作(比如插入操作后索引的维护)时,索引才是高效的. 对于非常小的表:大部分情况下简单的全表扫描更高效. 中到大型表:索引非常高效. 特大型表:建立和使用索引的代价非常高,可以使用分库分表或分区技术代替. 高性能的索引策略 索引的选择性越高则查询效率越高 因为选择性高的索引可以让MySQL在查找时过滤掉更多的行.唯一索引的选择性是1,这是最好的索引选择性,性能也是最好…
出处:http://blog.codinglabs.org/articles/theory-of-mysql-index.html   摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论.…
一.常见存储引擎 1.1 InnoDB InnoDB 是 MySQL 5.5 之后默认的存储引擎,它具有高可靠.高性能的特点,主要具备以下优势: DML 操作完全遵循 ACID 模型,支持事务,支持崩溃恢复,能够极大地保护用户的数据安全: 支持多版本并发控制,它会保存数据的旧版本信息,从而可以支持并发和事务的回滚: 支持行级锁,支持类似 Oracle 的一致性读的特性,从而可以承受高并发地访问: InnoDB 组织数据时默认按照主键进行聚簇,从而可以提高主键查找的效率.对于频繁访问的数据,Inn…
有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. 前言 数据库系列更新到现在我想大家对所有的概念都已有个大概认识了,这周我在看评论的时候我发现有个网友的提问我觉得很有意思:帅丙如何设计一个索引?你们都是怎么设计索引的?怎么设计更高效? 我一想索引我写过很多了呀,没道理读者还不会啊,但是我一回头看完,那确实,我就写了索引的概念,优劣势,没提到怎么设计…