mysql索引

MySQL的explain

早过忘川 提交于 2020-03-23 18:46:59
Select_type:所使用的查询类型,主要有以下这几种查询类型。 DEPENDENT SUBQUERY:子查询内层的第一个SELECT,依赖于外部查询的结果集。 DEPENDENT UNION:子查询中的UNION,且为UNION中从第二个SELECT开始的后面所有SELECT,同样依赖于外部查询的结果集。 PRIMARY:子查询中的最外层查询,注意并不是主键查询。 SIMPLE:除子查询或UNION之外的其他查询。 SUBQUERY:子查询内层查询的第一个SELECT,结果不依赖于外部查询结果集。 UNCACHEABLE SUBQUERY:结果集无法缓存的子查询。 UNION:UNION语句中第二个SELECT开始后面的所有SELECT,第一个SELECT为PRIMARY。 UNION RESULT:UNION 中的合并结果。 Table:显示这一步所访问的数据库中的表的名称。 Type:告诉我们对表使用的访问方式,主要包含如下集中类型。 all:全表扫描。 const:读常量,最多只会有一条记录匹配,由于是常量,实际上只须要读一次。 eq_ref:最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问。 fulltext:进行全文索引检索。 index:全索引扫描。 index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行合并(merge)

为什么代码规范要求SQL语句不要过多的join?

徘徊边缘 提交于 2020-03-23 12:21:44
作者: 柯三 juejin.im/post/5e0443ae6fb9a0162277a2c3 送分题 面试官: 有操作过Linux吗? 我: 有的呀 面试官: 我想查看内存的使用情况该用什么命令 我: free 或者 top 面试官: 那你说一下用free命令都可以看到啥信息 我: 那,如下图所示 可以看到内存以及缓存的使用情况 total 总内存 used 已用内存 free 空闲内存 buff/cache 已使用的缓存 avaiable 可用内存 面试官: 那你知道怎么清理已使用的缓存吗(buff/cache) 我: em… 不知道 面试官: sync; echo 3 > /proc/sys/vm/drop_caches 就可以清理buff/cache了,你说说我在线上执行这条命令做好不好? 我: (送分题,内心大喜)好处大大的有,清理出缓存我们就有更多可用的内存空间, 就跟pc上面xx卫士的小火箭一样,点一下,就释放出好多的内存 面试官: em…., 回去等通知吧 再谈SQL Join 面试官: 换个话题,谈谈你对join的理解 我: 好的(再答错就彻底完了,把握住机会) 回顾 SQL中的join可以根据某些条件把指定的表给结合起来并将数据返回给客户端 join的方式有 inner join 内连接 left join 左连接 right join 右连接 full join

Lucene入门

最后都变了- 提交于 2020-03-22 18:15:28
Lucene快速入门:   搭建环境     1.创建工程,引入坐标(springboot工程) <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <skipTests>true</skipTests> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> </parent> <dependencies> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2

mysql索引深入优化

a 夏天 提交于 2020-03-22 16:58:19
创建 test 测试表 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c1` varchar(10) DEFAULT NULL, `c2` varchar(10) DEFAULT NULL, `c3` varchar(10) DEFAULT NULL, `c4` varchar(10) DEFAULT NULL, `c5` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_test_c1234` (`c1`,`c2`,`c3`,`c4`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`, `c5`) values('1','a1','a2','a3','a4','a5'); insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`, `c5`) values('2','b1','b2','b3','b4','b5'); insert into `test` (`id`, `c1`, `c2`, `c3`, `c4`, `c5`) values('3','c1','c2','c3',

多列索引结构和原理

半城伤御伤魂 提交于 2020-03-21 23:32:43
本文摘抄自美团的技术博客 MySQL索引原理及慢查询优化 索引的数据结构 前面讲了生活中索引的例子,索引的基本原理,数据库的复杂性,又讲了操作系统的相关知识,目的就是让大家了解,任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,我们现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。那么我们就想到如果一个高度可控的多路搜索树是否能满足需求呢?就这样,b+树应运而生。 详解b+树 如上图,是一颗b+树,关于b+树的定义可以参见 B+树 ,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。 b+树的查找过程 如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短

MySQL大数据量分页性能优化

亡梦爱人 提交于 2020-03-21 15:47:08
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count 当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条), 如下: select * from product limit 10, 20 0.016秒 select * from product limit 100, 20 0.016秒 select * from product limit 1000, 20 0.047秒 select * from product limit 10000, 20 0.094秒 我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,那么我们把起始记录改为40w看下(也就是记录的一般左右) select * from product limit 400000, 20 3.229秒 再看我们取最后一页记录的时间 select * from product limit 866613, 20 37.44秒 难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时 间是无法忍受的。

索引的最左前缀原则

坚强是说给别人听的谎言 提交于 2020-03-21 07:37:42
索引的最左前缀原则 原理 mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引; 如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引; 范围查询 范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。 mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。 如where a>10 order by b ,索引a_b 无法排序 =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 查询条件中含有函数或表达式 如果查询条件中含有函数或表达式,则MySQL不会为这列使用索引(虽然某些在数学意义上可以使用)

explain的使用

拟墨画扇 提交于 2020-03-21 01:28:48
在对某个Query优化过程中,须要不断地使用explain来验证各种调整是否有效。 MySQL explain功能展示的各种信息的解释如下: id: MySQL Query Optimizer 选定的执行计划中查询的序列号。 select_type: 所使用的查询类型,主要有以下这几种查询类型。 DEPENDENT SUBQUERY:子查询内层的第一个select,依赖于外部查询的结果集。 DEPENDENT UNION:子查询中的union,且为union中从第二个select开始的后面所有的select,同样依赖于外部查询的结果集。 PRIMARY:子查询中的最外层查询,注意并不是主键查询。 SIMPLE:除子查询或者union之外的其他查询。 SUBQUERY:子查询内层查询的第一个select,结果不依赖于外部查询的结果集。 UNCACHETABLE SUBQUERY:结果集无法缓存的子查询。 UNION:union语句中第二个select开始后面的所有select,第一个select为primary。 UNION RESULT:union中的合并结果。 table:显示这一步所访问的数据库中的表的名称。 type:告诉我们队表使用的访问方式,主要包含如下几种类型。 all:全表扫描。 const:读常量,最多只会有一条记录匹配,由于是常量,实际上只须要读一次。 eq

MySQL为什么要给表加上主键

こ雲淡風輕ζ 提交于 2020-03-20 10:42:19
1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,并且是「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错,再说一遍,整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。   import matplotlib.pyplot as plt      plt.rcParams[www.yongyunzhuce.cn'font.sans-serif']=['SimHei']      x_data = [2011,2012,2013,2014,2015,2016,2017]      y_data = [www.zhuyngyule.cn 58000,60200,63000,71000,84000,90500,107000]      plt.xticks(x_data, ['2011年','2012年','2013年','2014年','2015年','2016年','2017年'])      plt.yticks(y_data)      plt.plot(x_data,www

MySQL为什么要给表加上主键

橙三吉。 提交于 2020-03-20 10:15:39
3 月,跳不动了?>>> 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,并且是「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错,再说一遍,整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。 3.给表中多个字段加上常规的索引,那么就会出现多个独立的索引结构.字段中的数据就会被复制一份出来,用于生成索引,叶子节点是主键ID,这也就是非聚集索引.,下面就是一个主键和三个常规索引的结构 4.通过主键去查,叶子节点就是数据行 5.通过其他索引字段去查,那么叶子节点是主键ID,然后再去根据主键查,聚集索引(主键)是通往真实数据所在的唯一路径 7.有一种例外可以不使用聚集索引就能查询出所需要的数据,这种非主流的方法称之为「覆盖索引」查询,也就是平时所说的复合索引或者多字段索引查询 以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优