首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试:mysql最全索引与优化详解

InnoDB 存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,建立哈希索引。 3....,顺序记录变长字段最大,varchar(20) NULL 标志:所有字段是不是为null,如果存在null,innodb用null标注所有的字段是否为空 在创建的时候会统计所有字段类型的大小,除开blobs...页的数据大小是一定的如果key太长,会导致一页数据存储行数变少,同时树的高度就变高了 非叶子节点 ?...,index 走索引,range:只检索给定范围的行, ref:非唯一性索引扫描, eq_ref:唯一性索引扫描,const:表示通过索引一次就可以找到,system:只有一条记录(等于系统)。...,不能大于 sort_buffer 的 order by 大 sort_buffer ,让其可以一次加入 order by 优: 不要用select * ,避免查出数据超过 sort_buffer

69050

什么是聚簇索引和非聚簇索引,如何理解回、索引下推

聚簇索引 聚簇索引简单理解就是将数据与索引放在一起,找到索引即找到了数据。换句话说,对于聚簇索引,其非叶子节点上存储的是索引字段的,而叶子节点上存储的是对应记录的整行数据。...因此,在 InnoDB 中: 对于聚簇索引,其非叶子节点上存储的是索引,而叶子节点上存储的是整行记录。 对于非聚簇索引,其非叶子节点上存储的是索引,而叶子节点上存储的是主键的以及索引。...而非主键(非聚簇)索引的叶子节点包含了主键的。 因此,当我们通过非聚簇索引进行查询时,首先会通过非聚簇索引查找到主键的,然后需要再通过主键的进行一次查询才能获取到我们要查询的数据。...它的工作原理如下:假设 people 中(zipcode,lastname,firstname)构成一个索引。...如果符合条件,根据该索引定位对应的数据;如果不符合,直接拒绝。有了索引下推优化,可以在有 like 条件查询的情况下,减少回次数。

23610
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL 的B+树索引.

B+ 树索引并不能找到一个给定键值的具体行。B+ 树索引能找到的只是被查找数据行所在的页。然后数据库通过把页读入到内存,再在内存中查找,最后得到要查找的数据。...,该字段显示为 NULL;Packed 关键字如何被压缩;Null 是否索引中的列含有 NULL ;Index_type 索引的类型。...这个并不是实时更新的,如果需要实时更新 Cardinality 的信息,可以使用 ANALYZE TABLE 命令。...建议在非高峰时间,对应用程序下的几张核心做 ANALYZE TABLE 操作,这能使优化器和索引更好的工作(除了 ANALYZE TABLE 外,还有 SHOW TABLE STATUS、SHOW INDEX...但是如果是统计操作,并且是覆盖索引的,优化器会进行选择。 ?

98220

MySQL order by的不同排序规则

全字段排序 全字段排序在内存中进行,不涉及磁盘IO、不需要回操作,但数据量受内存大小影响,有局限性。 语句执行流程: 初始化sort_buffer,将需要查询的字段放入sort_buffer。...逐行或从索引中找到满足where条件的主键id。 将主键id索引取出整行,取查询出的字段放入sort_buffer。 取下一个满足where条件的主键id。...rowid排序 rowid排序涉及磁盘IO,需要一次回操作,不受内存大小限制。...控制用于排序的行数据的长度,单行长度超过该,MySQL更换排序算法 SET max_length_for_sort_data = 16; 使用索引排序 语句执行流程: 从索引找到第一个满足where...MySQL的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。

28140

深入浅出,一文吃透mysql索引

假设我们有如下表,ID是主键,字段 k 上有索引: 主键索引和非主键索引的示意图如下: 其中R代表一整行。...主键索引和非主键索引的区别是: 主键索引的叶子节点存放的是整行数据; 非主键索引的叶子节点存放的是主键的; 非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。...统计信息的 sample_size 采样大小 stat_description 类型说明 查询 sys.schema_unused_indexes 查看有哪些索引一直未被使用过,可以被废弃。...索引优 函数索引 从 MySQL 5.7 版本开始,MySQL 开始支持创建函数索引 (即索引键是一个函数表达式)。...❝ 当对数据页进行更新时,如果数据页在内存中直接更新,如果不在 Innodb 会将更新操作记录在 change buffer 中,免了去磁盘中读取数据页的过程,下次查询的时候,再将数据页读入内存,结合

42830

InnoDB 存储引擎之索引和优化

在InnoDB中每张都必须有一个主键,如果在创建的时候没有显式定义主键,InnoDB首先会判断中是否有非空的唯一索引,如果有则将该列作为主键;否则InnoDB会自动创建一个6字节大小的指针作为主键...不过“在线修改日志“只存留在内存中,默认大小是128MB,如果修改结构时候DML操作太多,会导致该空间不够用而撤销修改。 3....使用覆盖索引的好处是辅助索引不包含整行记录,所以索引大小会远远小于聚簇索引,单个索引页就可以存储更多的索引项,那么访问索引本身的操作就可以减少顺序IO操作了。...如果SELECT列不能使用覆盖索引完成,那么除了在辅助索引上查到指定记录后,还需要进行一次书签访问才能查找到整行中其他列的数据,并且此时的查找将是成本很高的随机离散读操作(相对于传统机械磁盘)。...所以如果优化器觉得需要返回的数据量很少,优化器还是可能会选择使用辅助索引外加访问聚簇索引的方式来返回记录的;但是当访问数据量占整个表记录中挺大一部分的时候(比如20%),优化器可能会选择全扫描的方式来查找数据

39510

如何在Python对Excel进行读取

如果系统中同时安装了Python2和Python3,pip默认给Python2用,pip3指定给Python3用。...Xlrd 库简单的使用   以如下excel文件为例进行操作   文件名为demo,有两个sheet,名为工作1和工作2   工作1中有如下数据 ?...() print("sheets:" + str(data.sheet_names())) # 通过文件名获得工作,获取工作1 table = data.sheet_by_name('工作1')...# 打印data.sheet_names()可发现,返回的为一个列表,通过对列表索引操作获得工作1 # table = data.sheet_by_index(0) # 获取行数和列数 # 行数...和整列的,返回的结果为数组 # 整行:table.row_values(start,end) # 整列:table.col_values(start,end) # 参数 start 为从第几个开始打印

1.7K10

MySQL order by 是怎么工作的?

以下面这张为例,看一下 order by 的工作流程。 ? city 字段建有索引。...从索引 city 中找到第一个满足 city='杭州' 的主键ID(ID_x)。 到主键索引中找到 ID_x,取出整行,取 name、city、age 3个字段的,存入 sort_buffer。...从索引 city 中找到第一个满足 city='杭州' 的主键ID(ID_x)。 到主键索引中取出整行,把 name、id 这2个字段放入 sort_buffer。...查询过程变为: 从索引(city,name)找到第一个满足 city='杭州' 的主键ID。 到主键索引中取出整行,取 name、city、age 3个字段的,作为结果集的一部分直接返回。...小结 上面介绍了排序的工作流程,包括: 全字段排序 rowid 排序 并进一步思考如何对排序进行优化: 利用索引使查询结果本身就是有序的。 如果条件允许,使用覆盖索引,直接返回结果。

1.7K30

HBase面试题汇总

确认是否被禁用 drop/drop_all 删除一个或全部 truncate 禁用、删除并重建一个 数据操作命令 命令 描述 put 添加一个到单元格中 get 通过名、行键等参数获取行或单元格数据...那么,要查询的数据也会先经过哈希计算,在数组中快速寻找,如果已经置为1,说明数据可能在这个集合中,如果为0,说明一定不在集合中。 所以布隆过滤器是一种粗略的过滤手段。...如果在查询数据时,同时发现这3个位置均为1,说明很大的概率可以在当前集合中找到期望的数据,否则一定不在当前集合中。 从HBase 0.96以来,默认启用基于行的Bloom Filters。...如果经常扫描整行数据,可以使用row方式的布隆过滤器,此时也可以加快行+列的查询速度。 如果经常查询某行某列的数据,可以使用row+column方式的布隆过滤器,但它不会加快对整行数据的查询效率。...布隆过滤器开启后,在生产环境中是否有效,此时可以查看RegionServer中的blockCacheHitRatio如果开启后增加,说明是正优化。

21930

如何在Java中调整垃圾回收(翻译)

但是为了完成跟踪对象引用和在内存中移动对象的工作,需要确保应用程序线程当前没有使用这些对象,举个例子,如果应用程序线程正在使用对象,对象的内存位置会由于GC而发生更改,这是更坏和不可预测的事情。...-- more --> 堆的大小由两个控制:用ms参数指定的初始和用mx参数指定的最大 例如 -Xms1g -Xmx8g 拥有堆的初始和最大大小允许JVM是根据工作负载自动调整堆大小。...例如: -XX:-UseAdaptiveSizePolicy 另外,将初始堆大小设置为与最大堆大小相同的,或将初始新生代大小设置为与最大新生代大小相同的,可以有效地关闭部分自适应大小整行为。...GC性能如果启用了自适应大小调整,则可以使用MaxGCPauseMillis参数来调整GC行为。此标志为最大GC暂停时间设置目标。...如果优堆大小优收集器对您不起作用,那么您可以尝试另一个收集器。如果您仍然没有得到好的结果,那么您需要考虑调整应用程序代码本身。 愉快的优吧!

88540

如何在Java中调整垃圾回收(翻译)

但是为了完成跟踪对象引用和在内存中移动对象的工作,需要确保应用程序线程当前没有使用这些对象,举个例子,如果应用程序线程正在使用对象,对象的内存位置会由于GC而发生更改,这是更坏和不可预测的事情。...堆的大小由两个控制:用ms参数指定的初始和用mx参数指定的最大 例如 -Xms1g -Xmx8g 拥有堆的初始和最大大小允许JVM是根据工作负载自动调整堆大小。...例如: -XX:-UseAdaptiveSizePolicy 另外,将初始堆大小设置为与最大堆大小相同的,或将初始新生代大小设置为与最大新生代大小相同的,可以有效地关闭部分自适应大小整行为。...GC性能如果启用了自适应大小调整,则可以使用MaxGCPauseMillis参数来调整GC行为。此标志为最大GC暂停时间设置目标。...如果优堆大小优收集器对您不起作用,那么您可以尝试另一个收集器。如果您仍然没有得到好的结果,那么您需要考虑调整应用程序代码本身。 愉快的优吧!

69240

面试就面试,问我原理干嘛,order by

id 3)到主键 id 的索引树上查找到对应的整行数据(回查询),然后取出 city、username、age 三个字段的,存入 sort_buffer 中 4)从索引 city 取下一个记录的主键...如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,就需要利用磁盘临时文件来辅助排序。...解释下这里使用磁盘临时文件来进行辅助排序的含义,外部排序常用的排序算法是多路归并排序算法,具体步骤如下: 到主键 id 索引树上查找到对应的整行数据后,取 city、username、age 三个字段的...)到主键 id 的索引树上查找到对应的整行数据(回查询),取出 username 和 id 这两个字段,存入 sort_buffer 中 4)从 city 索引中取下一个记录的主键 id;重复步骤 3...这样整个查询过程的流程就变成了: 1)从联合索引 (city, username) 上找到第一个满足 city='南京' 条件的主键 id 2)到主键 id 的索引树上查找到对应的整行数据(回查询),

59430

优化MongoDB复合索引

很明显,有三条满足条件的记录,通过explain(),我们可以看到Mongodb是如何找到这三条记录的: ?...如何解读explain()的结果呢,首先看游标类型, BasicCursor是一个需要警惕的标识,BasicCursor意味着MongoDB必须要做全扫描,如果记录数量在百万级别,全扫描肯定是太慢了...如果timestamp字段会被作为查询的范围过滤字段,那么把它加到索引里就是有价值的。否则只会额外增加索引的大小。...如果某些字段不会被查询条件使用到,那就不需要将其加入索引中,这样可以减小索引大小。此外,如果某个字段作为索引,无法过滤掉90%以上的数据,就建议将其从索引中忽略。...现就职于腾讯互娱 技术运营部,参与MongoDB的集群维护工作

2.8K30

优化MongoDB复合索引

很明显,有三条满足条件的记录,通过explain(),我们可以看到Mongodb是如何找到这三条记录的: ?...如何解读explain()的结果呢,首先看游标类型, BasicCursor是一个需要警惕的标识,BasicCursor意味着MongoDB必须要做全扫描,如果记录数量在百万级别,全扫描肯定是太慢了...如果timestamp字段会被作为查询的范围过滤字段,那么把它加到索引里就是有价值的。否则只会额外增加索引的大小。...如果某些字段不会被查询条件使用到,那就不需要将其加入索引中,这样可以减小索引大小。此外,如果某个字段作为索引,无法过滤掉90%以上的数据,就建议将其从索引中忽略。...现就职于腾讯互娱 技术运营部,参与MongoDB的集群维护工作。 转载时,须注明作者、译者、出处和微信号。

2.8K20

python+xlrd+xlwt操作ex

介绍 ---- xlrd(读操作),xlwt(写操作) 上述软件下载后,分别解压,之后在cmd命令下分别进入对应的目录中运行 python setup.py install 如果运行过程中提示缺少setuptools...,先运行python ez_setup.py之后在重复上面的步骤 PS:office的版本不要用太高的,建议最好用03版本的,且后缀为xls的 源码bug修复 ---- 安装好xlwt3后,找到formula.py..., sheet.row_values(0)) #获取整行的内容 print("第2列的", sheet.col_values(1)) #获取整列的内容 print("第2行2列的", sheet.cell_value...(1,1)) #获取单元格的 show_excel(path) #写入数据 def write_excel(path): wb=xlwt3.Workbook()#创建工作薄 sheet=wb.add_sheet...("xlwt3数据测试表",cell_overwrite_ok=True)#创建工作 value = [["名称", "小强python自动化测试实战", "小强性能测试实战"], ["价格", "52.3

63810

Mysql如何使用order by工作

如图所示,通常情况下,这个语句的流程如下 初始化sort_buffer,确定放入name,city,age这三个字段 从索引中找到第一个杭州的主键id 然后到主键id取出整行(name,age,city...图中nama的排序有可能在内存中完成,也就可能使用外部排序,这个取决于所需的内存和参数sort_buffer_size sort_buffer_size,就是Mysql为排序开辟的内存的大小如果排序的数据量小于...sort_buffer_size,排序就在内存中排序,如果大于内存大小,就会使用磁盘的临时文件辅助排序, 我们可以使用下面方法,来确定一个排序语句是否使用了临时文件 /* 打开optimizer_trace...新的算法放入sort_buffer的字段,只需要排序的列和主键id,但是这个时候,并不能直接返回排序的结果,而是要回查询整行。...初始化sort_buffer,确定放入两个字段,即name和id 从索引city中找到第一个满足的条件主键id 再到主键id索引中获取整行,取出name,id两个字段,存入sort_buffer 在从索引

1K20

同事问我,SQL 语句明明命中了索引,为什么执行很慢?

1、工作准备:建,造数据 首先创建一张 user ,并创建一个 id的主键索引,和一个 user_name 的普通索引。...如果要永久生效,必须修改配置文件 my.cnf long_query_time的默认为10 秒,支持二次修改。线上我们一般会设置成1秒,如果业务对延迟敏感的话,我们根据需要设置一个更低的。 ?...mysql 优化器根据主键索引找到第一个 id>0 的,虽然走了索引但其实还是全扫描。 没命中索引会走全扫描,命中了索引也可能走全扫描。 ?...执行流程: ① 首先在 idx_user_name_age 索引树,查找第一个以 Tom哥-1 开头的记录对应的主键id ② 根据主键id从主键索引树找到整行记录,并根据age做判断过滤,等于29留下...如果是,回 取出整行数据,作为后面的结果返回;如果不是,丢弃 ③ 在 idx_user_name_age 联合索引树上向右遍历,重复第二步,直到user_name不是以 Tom哥-1 开头,结束

2.5K30

MySQL InnoDB索引的存储结构

InnoDB索引的数据结构 InnoDB索引采用了B-Tree的数据结构,数据存储在叶子节点上,每个叶子节点默认的大小是16KB。...叶子节点可使用的容量为总容量的15/16,InnoDB会留1/16的空间,以备将来插入和更新索引记录时使用, 如果以随机顺序插入记录,页面的容量为1/2到15/16之间。...主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。整张的数据其实就是存储在聚簇索引中的,聚簇索引就是如果没有设置主键怎么办呢?...MySQL会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,MySQL自动为InnoDB生成一个隐含字段作为主键。 聚簇索引结构如下图所示: 非主键索引的叶子节点内容是主键的。...二级索引的叶子节点中存的是主键的,不是原始的数据,所以二级索引找到主键的之后,需要用该主键再去主键索引上查找一次,才能获取到最终的数据,这个过程叫做回,这也是“二级”的含义。

87120

MySQL优化

索引目的 提高查询效率 【类比字典和借书】 如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。...如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。...去图书馆借书也是一样,如果你要借某一本书,一定是先找到对应的分类科目,再找到对应的编号,这是生活中活生生的例子,通用索引,可以加快查询速度,快速定位。...【如果节点大小和BTree大小不对齐,那么同一页节点可能需要两次IO读取】 综上所述,用B-Tree作为索引结构效率是非常高的。 为什么B+Tree比BTree更适合作为索引结构?...Hash索引本质上是Hash,是一种KV键值对的存储结构。 无法提高区间访问速度。 B+Tree的叶子结点可以存哪些东西? 可能是整行数据,也可能是主键的

1K40

和产品争论MySQL底层如何实现order by的,惨败!

不知道了吧,我来告诉你吧: 初始化sort_buffer,确定放入name、city、age三字段 从索引city找到第一个满足city='上海’条件的主键id, 即id_x; 到id主键索引取出整行,...若 sort_buffer_size 超过需排序的数据量大小 number_of_tmp_files 就是0,即排序可直接在内存完成。 否则就需要放在临时文件中排序。...因为查询OPTIMIZER_TRACE时,需要用到临时,而internal_tmp_disk_storage_engine的默认是InnoDB。...MySQL之所以需要生成临时,并且在临时上做排序,是因为原来的数据都是无序的。 如果能保证从city索引上取出来的行,天生就是按name递增排序,是不是就可以不用再排序了?是的。...这样整个查询过程的流程就变成: 从索引(city,name)找到第一个满足city='上海’条件的主键id 到主键id索引取出整行,取name、city、age三个字段的,作为结果集的一部分直接返回

65920
领券