mysql explain详解

2023-10-29

转自:http://www.blogjava.net/persister/archive/2008/10/27/236813.html

在 explain的帮助下,您就知道什么时候该给表添加索引,以使用索引来查找记录从而让select 运行更快。
如果由于不恰当使用索引而引起一些问题的话,可以运行 analyze table来更新该表的统计信息,例如键的基数,它能帮您在优化方面做出更好的选择。


explain结果的每行记录显示了每个表的相关信息,每行记录都包含以下几个字段:

id 
本次 select 的标识符。在查询中每个 select都有一个顺序的数值。


select_type 
select 的类型,可能会有以下几种:


simple: 简单的 select (没有使用 union或子查询)

primary: 最外层的 select。

union: 第二层,在select 之后使用了 union。

dependent union: union 语句中的第二个select,依赖于外部子查询

subquery: 子查询中的第一个 select

dependent subquery: 子查询中的第一个 subquery依赖于外部的子查询

derived: 派生表 select(from子句中的子查询)


table
记录查询引用的表。


type
表连接类型。以下列出了各种不同类型的表连接,依次是从最好的到最差的:

system:表只有一行记录(等于系统表)。这是 const表连接类型的一个特例。

const:表中最多只有一行匹配的记录,它在查询一开始的时候就会被读取出来。由于只有一行记录,在余下的优化程序里该行记录的字段值可以被当作是一个 恒定值。const表查询起来非常快,因为只要读取一次!const 用于在和 primary key 或unique 索引中有固定值比较的情形。下面的几个查询中,tbl_name 就是 c表了:
select * from tbl_name where primary_key=1; select * from tbl_namewhere primary_key_part1=1 and primary_key_part2=2;


eq_ref:从该表中会有一行记录被读取出来以和从前一个表中读取出来的记录做联合。与const类型不同的是,这是最好的连接类型。它用在索引所有部 分都用于做连接并且这个索引是一个primary key 或 unique 类型。eq_ref可以用于在进行"="做比较时检索字段。比较的值可以是固定值或者是表达式,表达示中可以使用表里的字段,它们在读表之前已经准备好 了。以下的几个例子中,mysql使用了eq_ref 连接来处理 ref_table:


select * from ref_table,other_table whereref_table.key_column=other_table.column; select * fromref_table,other_table whereref_table.key_column_part1=other_table.column andref_table.key_column_part2=1;

ref: 该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者是该键不是 primary key 或 unique索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。 ref还可以用于检索字段使用 =操作符来比较的时候。以下的几个例子中,mysql将使用 ref 来处理ref_table:
select * from ref_table where key_column=expr; select * fromref_table,other_table whereref_table.key_column=other_table.column; select * fromref_table,other_table whereref_table.key_column_part1=other_table.column andref_table.key_column_part2=1;

ref_or_null: 这种连接类型类似 ref,不同的是mysql会在检索的时候额外的搜索包含null 值的记录。这种连接类型的优化是从mysql4.1.1开始的,它经常用于子查询。在以下的例子中,mysql使用ref_or_null 类型来处理 ref_table:
select * from ref_table where key_column=expr or key_column is null;


unique_subquery: 这种类型用例如一下形式的 in 子查询来替换 ref:
value in (select primary_key from single_table where some_expr)

unique_subquery: 只是用来完全替换子查询的索引查找函数效率更高了。

index_subquery: 这种连接类型类似 unique_subquery。它用子查询来代替in,不过它用于在子查询中没有唯一索引的情况下,例如以下形式:
value in (select key_column from single_table where some_expr)

range: 只有在给定范围的记录才会被取出来,利用索引来取得一条记录。key字段表示使用了哪个索引。key_len字段包括了使用的键的最长部分。这种类型时 ref 字段值是 null。range用于将某个字段和一个定植用以下任何操作符比较时 =, <>, >,>=, <, <=, is null, <=>, between, 或 in:
select * from tbl_name where key_column = 10; select * fromtbl_name where key_column between 10 and 20; select * from tbl_namewhere key_column in (10,20,30); select * from tbl_name wherekey_part1= 10 and key_part2 in (10,20,30);

index: 连接类型跟 all 一样,不同的是它只扫描索引树。它通常会比 all快点,因为索引文件通常比数据文件小。mysql在查询的字段知识单独的索引的一部分的情况下使用这种连接类型。

all: 将对该表做全部扫描以和从前一个表中取得的记录作联合。这时候如果第一个表没有被标识为const的话就不大好了,在其他情况下通常是非常糟糕的。正常地,可以通过增加索引使得能从表中更快的取得记录以避免all。



possible_keys
possible_keys字段是指 mysql在搜索表记录时可能使用哪个索引。注意,这个字段完全独立于explain 显示的表顺序。这就意味着 possible_keys里面所包含的索引可能在实际的使用中没用到。如果这个字段的值是null,就表示没有索引被用到。这种情况下,就可以检查 where子句中哪些字段那些字段适合增加索引以提高查询的性能。就这样,创建一下索引,然后再用explain 检查一下。详细的查看章节"14.2.2 alter tablesyntax"。想看表都有什么索引,可以通过 show index from tbl_name来看。

 
key
key字段显示了mysql实际上要用的索引。当没有任何索引被用到的时候,这个字段的值就是null。想要让mysql强行使用或者忽略在 possible_keys字段中的索引列表,可以在查询语句中使用关键字force index, use index,或 ignore index。如果是 myisam 和 bdb 类型表,可以使用 analyzetable 来帮助分析使用使用哪个索引更好。如果是 myisam类型表,运行命令 myisamchk --analyze也是一样的效果。详细的可以查看章节"14.5.2.1 analyze tablesyntax"和"5.7.2 table maintenance and crash recovery"。

key_len
key_len 字段显示了mysql使用索引的长度。当 key 字段的值为 null时,索引的长度就是 null。注意,key_len的值可以告诉你在联合索引中mysql会真正使用了哪些索引。

ref
ref 字段显示了哪些字段或者常量被用来和 key配合从表中查询记录出来。

rows
rows 字段显示了mysql认为在查询中应该检索的记录数。

extra

本字段显示了查询中mysql的附加信息。以下是这个字段的几个不同值的解释:

distinct:mysql当找到当前记录的匹配联合结果的第一条记录之后,就不再搜索其他记录了。

not exists:mysql在查询时做一个 left join优化时,当它在当前表中找到了和前一条记录符合 left join条件后,就不再搜索更多的记录了。下面是一个这种类型的查询例子:
select * from t1 left join t2 on t1.id=t2.id where t2.id isnull;

假使 t2.id 定义为 not null。这种情况下,mysql将会扫描表 t1并且用 t1.id 的值在 t2 中查找记录。当在 t2中找到一条匹配的记录时,这就意味着 t2.id 肯定不会都是null,就不会再在 t2 中查找相同 id值的其他记录了。也可以这么说,对于 t1 中的每个记录,mysql只需要在t2 中做一次查找,而不管在 t2 中实际有多少匹配的记录。

range checked for each record (index map: #)

mysql没找到合适的可用的索引。取代的办法是,对于前一个表的每一个行连接,它会做一个检验以决定该使用哪个索引(如果有的话),并且使用这个索引来从表里取得记录。这个过程不会很快,但总比没有任何索引时做表连接来得快。

using filesort: mysql需要额外的做一遍从而以排好的顺序取得记录。排序程序根据连接的类型遍历所有的记录,并且将所有符合 where条件的记录的要排序的键和指向记录的指针存储起来。这些键已经排完序了,对应的记录也会按照排好的顺序取出来。详情请看"7.2.9how mysql optimizes order by"。
using index

字段的信息直接从索引树中的信息取得,而不再去扫描实际的记录。这种策略用于查询时的字段是一个独立索引的一部分。

using temporary: mysql需要创建临时表存储结果以完成查询。这种情况通常发生在查询时包含了groupby 和 order by 子句,它以不同的方式列出了各个字段。
using where

where子句将用来限制哪些记录匹配了下一个表或者发送给客户端。除非你特别地想要取得或者检查表种的所有记录,否则的话当查询的extra 字段值不是 using where 并且表连接类型是 all 或 index时可能表示有问题。


如果你想要让查询尽可能的快,那么就应该注意 extra 字段的值为usingfilesort 和 using temporary 的情况。

你可以通过 explain 的结果中 rows字段的值的乘积大概地知道本次连接表现如何。它可以粗略地告诉我们mysql在查询过程中会查询多少条记录。如果是使用系统变量 max_join_size 来取得查询结果,这个乘积还可以用来确定会执行哪些多表select 语句。
下面的例子展示了如何通过 explain提供的信息来较大程度地优化多表联合查询的性能。
假设有下面的 select 语句,正打算用 explain 来检测:
explain select tt.ticketnumber, tt.timein, tt.projectreference,tt.estimatedshipdate, tt.actualshipdate, tt.clientid,tt.servicecodes, tt.repetitiveid, tt.currentprocess,tt.currentdppers tt.recordvolume, tt.dpprinted, et.country,et_1.country, do.custname from tt, et, et as et_1, do wherett.submittime is null and tt.actualpc = et.employid andtt.assignedpc = et_1.employid and tt.clientid = do.custnmbr;

在这个例子中,先做以下假设:

 

要比较的字段定义如下:
table  column  columntype 
tt  actualpc char(10) 
tt  assignedpc char(10) 
tt  clientid char(10) 
et  employid char(15) 
do  custnmbr char(15) 


数据表的索引如下:
table  index 
tt  actualpc 
tt  assignedpc 
tt  clientid 
et  employid (primary key) 
do  custnmbr (primary key) 


tt.actualpc 的值是不均匀分布的。

在任何优化措施未采取之前,经过 explain分析的结果显示如下:
table type possible_keys key key_len ref rows extra 
et all primarynull null null 74 
do all primary null null null 2135 
et_1 allprimary null null null 74 
tt all assignedpc, null null null 3872 clientid, actualpc range checked for each record (key map: 35)

由于字段 type 的对于每个表值都是all,这个结果意味着mysql对所有的表做一个迪卡尔积;这就是说,每条记录的组合。这将需要花很长的时间,因为需要扫描每个表总 记录数乘积的总和。在这情况下,它的积是74 * 2135 * 74 * 3872 = 45,268,558,720条记录。如果数据表更大的话,你可以想象一下需要多长的时间。
在这里有个问题是当字段定义一样的时候,mysql就可以在这些字段上更快的是用索引(对isam类型的表来说,除非字段定义完全一样,否则不会使用索 引)。在这个前提下,varchar和 char是一样的除非它们定义的长度不一致。由于 tt.actualpc 定义为char(10),et.employid 定义为 char(15),二者长度不一致。
为了解决这个问题,需要用 alter table 来加大 actualpc的长度从10到15个字符:
mysql> alter table tt modify actualpc varchar(15);

现在 tt.actualpc 和 et.employid 都是 varchar(15)
了。再来执行一次 explain 语句看看结果:
table type possible_keys key key_len ref rows extra 
tt allassignedpc, null null null 3872 using clientid, where actualpc 
do all primary null null null 2135 range checked for each record (keymap: 1) 
et_1 all primary null null null 74 range checked for eachrecord (key map: 1) et eq_ref primary primary 15 tt.actualpc 1

这还不够,它还可以做的更好:现在 rows值乘积已经少了74倍。这次查询需要用2秒钟。
第二个改变是消除在比较 tt.assignedpc = et_1.employid 和 tt.clientid= do.custnmbr 中字段的长度不一致问题:
mysql> alter table tt modify assignedpc varchar(15), ->modify clientid varchar(15);

现在 explain 的结果如下:
table type possible_keys key key_len ref rows extra 
et all primary null null null 74 
tt ref assignedpc, actualpc 15 et.employid 52 using clientid, where actualpc 
et_1 eq_ref primary primary 15 tt.assignedpc 1 
do eq_ref primary primary 15 tt.clientid 1

这看起来已经是能做的最好的结果了。
遗留下来的问题是,mysql默认地认为字段 tt.actualpc的值是均匀分布的,然而表 tt并非如此。幸好,我们可以很方便的让mysql分析索引的分布:
mysql> analyze table tt;

到此为止,表连接已经优化的很完美了,explain 的结果如下:
table type possible_keys key key_len ref rows extra 
tt all assignedpc null null null 3872 using clientid, where actualpc 
et eq_ref primary primary 15 tt.actualpc 1 
et_1 eq_ref primary primary 15 tt.assignedpc 1 
do eq_ref primary primary 15 tt.clientid 1

请注意,explain 结果中的 rows字段的值也是mysql的连接优化程序大致猜测的,请检查这个值跟真实值是否基本一致。如果不是,可以通过在select 语句中使用 straight_join 来取得更好的性能,同时可以试着在from分句中用不同的次序列出各个表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql explain详解 的相关文章

  • 吐槽大会,来瞧瞧资深老前端写的垃圾代码

    忍无可忍 不吐不快 本期不写技术文章 单纯来吐槽下公司项目里的奇葩代码 还都是一些资深老前端写的 希望各位对号入座 知道了什么是烂代码 才能写出好代码 别说什么代码和人有一个能跑就行的话 玩笑归玩笑 人都有菜的时候 写出垃圾代码无可厚非 但
  • 面试时,被问到频繁跳槽该如何回应?

    有数据显示 现在的职场人 跳槽越来越频繁 95后平均7个月就离职 对于面试官来说 一个跳槽过于频繁的人总是存在潜在风险 比如抗压力差 稳定性不好 心不定这山望着那山高 职业规划不清晰等等 我一直强调一个观点 职场人跳槽 应该是为了下一步有更
  • 十八、部署 Vue.js 项目到生产环境

    本章概要 构建发布版本 部署 项目开发完毕并测试后 就要准备构建发布版本 部署到生产环境 18 1 构建发布版本 在构建发布版本前 注意将项目代码中用于调试的 alert debugger console log 等语句删除或注释 在生产环
  • Linux目录读写和可执行权限

    一 进入目录权限 如果我在普通用户下创建了一个目录f1 然后使用chomd u rwx g rwx o rwx之后 我在普通用户下想进入f1目录 权限不允许 然后我切换到超级用户下 再次尝试进入到f1目录 这个时候允许进入 然后回到普通用户
  • static的作用域

    一 面向过程设计中的static 1 静态全局变量 在全局变量前 加上关键字static 该变量就被定义成为一个静态全局变量 静态全局变量有以下特点 该变量在全局数据区分配内存 未经初始化的静态全局变量会被程序自动初始化为0 自动变量的值是
  • Linux下rgmii接口,zynq7010 petalinux 2019.2 RGMII via EMIO 连接问题

    各位好 遇到一个问题 petalinux 2019 2 zynq7010 通过gmii to rgmii 连接挂外EMIO管脚上的PHY kernel启动没有识别PHY的动作 在非linux环境下测试过网络是OK的 u boot下也能够正常
  • Gcc 编译时指定宏

    gcc 编译指定宏 那在makefile里面 gcc DMACRONAME MACRODEF 或者 gcc DMACRONAME 这样就定义了预处理宏 编译的时候可选代码就会被编译进去了 举例说明 Dmacro string 等价于在头文件
  • ubuntu16.04 安装 pygraphviz

    sudo apt get install python pydot python pydot ng graphviz graphviz dev sudo pip3 install pygraphviz
  • qt自定义控件设置属性

    自定义控件设置的属性出现在ui designer控件栏 参考 https blog csdn net Mingyueruya article details 121268933 主要是靠Q PROPERTY 定义一个QString类型 名字
  • C#入门-简介

    一 入门 1 简介 1 1 C 语言介绍 C 是一种新式编程语言 不仅面向对象 还类型安全 C 是面向对象的 面向组件的编程语言 多项 C 功能有助于创建可靠且持久的应用程序 垃圾回收自动回收不可访问的未用对象所占用的内存 可以为 null
  • 中标龙芯、deepin龙芯、ubuntu证书存放路径及安装卸载说明

    中标龙芯 deepin龙芯 ubuntu证书存放路径及安装卸载说明 一 Ubuntu deepin龙芯 证书路径 etc ssl certs ca certificates crt 安装步骤 1 生成 crt后缀证书 如test crt 2
  • fiddler抓包番外————了解工具栏

    前言 作为一款功能强大的工具 Fiddler 提供了许多实用的功能和工具栏 可以帮助用户更加高效地使用它 如果您想了解 Fiddler 的工具栏及其功能 那么本篇文章就是为您准备的 在这里 我将为大家详细介绍 Fiddler 的工具栏及其各
  • ubuntu linux 教程 pdf,Ubuntu 12.04 菜鸟完全使用教程(四) PDF

    Linux公社已经在先前发布Suruibin 同学制作的 Ubuntu 12 04 菜鸟使用手册一到三系列教程 看来 Suruibin 同学是要将这套教程进行到底了 Ubuntu 12 04 菜鸟使用手册 四 已经写好了 当我们面对一件繁杂
  • 主备延迟监控

    主备延迟的模拟 文章目录 主备延迟的模拟 1 基本工具的安装 1 1 安装 percona toolkit 1 2 安装 sysbench 2 搭建延迟监控 1 基本工具的安装 1 1 安装 percona toolkit 这玩意儿工具挺全
  • Java的jar包依赖版本冲突解决

    参考 https blog csdn net weixin 38898423 article details 128178055 https blog csdn net Yal insist article details 12766998
  • Student类,包括学生姓名、性别、年龄、Java成绩。要求创建五个该类对象,输出每个学生信息,计算并输出这五个学生Java成绩的平均值, 以及计算并输出他们Ja

    一 Student类 包括学生姓名 性别 年龄 Java成绩 要求创建五个该类对象 输出每个学生信息 计算并输出这五个学生Java成绩的平均值 以及计算并输出他们Java成绩的最高分以及最低分是多少 分别是哪位同学 public class
  • 推荐使用maven shade进行打包,assembly打包会出现若干问题

    现在基本上都是采用maven来进行开发管理 我有一个需求是需要把通过maven管理的java工程打成可执行的jar包 这样也就是说必需把工程依赖的jar包也一起打包 而使用maven默认的package命令构建的jar包中只包括了工程自身的
  • c#调用c++ dll的几种类型转换

    在合作开发时 C 时常需要调用C DLL 当传递参数时时常遇到问题 尤其是传递和返回字符串是 现总结一下 分享给大家 VC 中主要字符串类型为 LPSTR LPCSTR LPCTSTR string CString LPCWSTR LPWS
  • springboot集成

    maven配置
  • conda虚拟环境下启动jupyter,jupyter不能使用该环境下的python

    文章目录 1 问题描述 2 解决方法 参考 1 问题描述 系统的python3版本为python 3 7 当前Conda环境为python 3 6 8 但不管激活虚拟环境与否 jupyter都运行在python 3 7的环境下 如下所示 在

随机推荐

  • 多线程事务控制

    多线程事务控制 spring无法对多线程进行事务控制 原因是 多线程底层连接数据库的时候 是使用的线程变量 TheadLocal 所以 开多少线程理论上就会建立多少个连接 每个线程有自己的连接 事务肯定不是同一个了 解决办法 我强制手动把每
  • 执行若依(ruoyi)项目

    执行若依项目 包含下载 更改配置 报错等介绍 一 成功执行演示 二 若依官网下载 三 修改相关配置 四 执行与show 一 成功执行演示 介绍1 若依框架是开源的项目且前后端分离开发 下图所示 左边是后端成功执行 右边是前端成功执行 介绍2
  • Unity 获取虚拟相机的画面

    void Fun Camera m Camera string filePath RenderTexture rt new RenderTexture Screen width Screen height 16 m Camera targe
  • 掌握Python的X篇_20_默认参、字典的展开

    文章目录 1 默认参数 2 指定实参值对应的形参 3 接受任意多个key value方式的参数 4 字典展开为key value键值对的多个参数 1 默认参数 我们可以通过 为形参指定默认值 这样函数调用过程中如果不传对应实参 就会使用默认
  • 最小覆盖圆(smallest enclosing circle)算法 python 实现

    百度一圈没有找到合适的博客 通过外网找到了python实现 所以整理记录一下 最小圆问题 The smallest circle problem also known as minimum covering circle problem b
  • FPGA学习笔记(三) 流水灯入门FPGA设计流程及阻塞/非阻塞赋值的分析

    系列文章目录 一 FPGA学习笔记 一 入门背景 软件及时钟约束 二 FPGA学习笔记 二 Verilog语法初步学习 语法篇1 三 FPGA学习笔记 三 流水灯入门FPGA设计流程 四 FPGA学习笔记 四 通过数码管学习顶层模块和例化的
  • 云计算系列知识点——云计算基础

    系列文章目录 云计算系列知识点 云计算基础 云计算系列知识点 云服务器产品 云计算系列知识点 网络 公网 私网 VPN等 基础知识与计费模式 文章目录 系列文章目录 云计算技术架构 计算虚拟化 KVM 容器技术 数据中心等级分为T1 T4
  • 软件测试策略

    历史的车轮滚滚向前 科技的创新生生不息 大数据 虚拟现实 智能汽车 区块链等为代表的新技术和新应用层出不穷 它们都与软件息息相关 而软件的质量保证离不开软件测试 软件测试要在成本 范围 进度 资源等因素的制约下取得最佳产出 就离不开测试策略
  • 【多字典公共键】快速找到多个字典的公共键及非公共键

    前言 在进行一个项目过程中遇到一个多个URL参数对比与分析的问题 所以就有了这个博客 单纯的了解找到多个字典的公共键的问题 可以移步到 python进阶 python进阶技巧 找到2 5 快速找到多个字典的公共键 想看实操 不妨浏览一下下面
  • keil关于use MicroLIB 和半主机模式的总结

    半主机是这么一种机制 它使得在ARM目标上跑的代码 如果主机电脑运行了调试器 那么该代码可以使用该主机电脑的输入输出设备 这点非常重要 因为开发初期 可能开发者根本不知道该 ARM 器件上有什么输入输出设备 而半主基机制使得你不用知道ARM
  • 虚拟机连接本地数据库

    我们在运行虚拟机上面的项目时 可能要用到本机的数据库 在使用过程中会遇到数据库拒绝访问的情况 这是因为在安装本地数据库时没有启动远程连接 使用两种方法来解决这种问题 一 使用命令行模式 第一步 先切换到MySQL的安装路径下面的bin目录
  • 百分率的sql

    百分比的sql语句 方式一的百分比的sql 说明 这条sql是在一张表里面进行查询 将不同的级别的工程师的百分率查询出来 第一个sql select tmp job grade tmp tcount tmp1 t1count from se
  • 基于单片机的数字频率计设计

    数字频率计概述 数字频率计是计算机 通讯设备 音频视频等科研生产领域不可缺少的测量仪器 它是一种用十进制数字显示被测信号频率的数字测量仪器 它的基本功能是测量正弦信号 方波信号及其他各种单位时间内变化的物理量 在进行模拟 数字电路的设计 安
  • 【力扣】205.同构字符串

    同构字符串 同构字符串 1 题目描述 2 示例 3 代码 方式1 方式2 5 编译结果 同构字符串 1 题目描述 给定两个字符串 s 和 t 判断它们是否是同构的 如果 s 中的字符可以按某种映射关系替换得到 t 那么这两个字符串是同构的
  • 【蓝桥杯Python】2023.2.3-寻找2020

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝有一个数字矩阵 里面只包含数字 00 和 22 小蓝很喜欢 20202020 他想找 到这个数字矩阵中有多少个 20202020 小蓝只关注三种构成 20
  • 2023华为OD机试真题【施肥问题】

    题目描述 思路题解 首先需要计算每个果园的施肥时间 即果园面积除以施肥机能效 然后找到最小的施肥机能效 保证施肥任务能在规定时间内完成 如果施肥天数小于果园数量 则无法完成施肥任务 返回 1 如果施肥天数等于果园数量 则直接返回最大果园面积
  • 编译原理第七章笔记 -- 中间代码生成

    本文中内容整理西安交通大学软件学院吴晓军老师的ppt中 仅供学习使用 请勿转载或他用 参考教材 程序设计语言 编译原理 第3版 陈火旺等 国防工业出版社 这一章分数在35左右 两个大题 数组的引用四元式生成 控制语句当中布尔表达式的翻译 考
  • 运维必学

    欢迎关注 全栈工程师修炼指南 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 专注 企业运维实践 网络安全 系统运维 应用开发 物联网实战 全栈文章 等知识分享 花开堪折直须折 莫待无花空折枝 作者 lt 安全开发运维 gt
  • VS2012编译安装VTK-5.10.1(支持Python)

    1 源码下载 到参考资料 1 下载vtk 5 10 1 zip和vtkdata 5 10 1 zip 2 源码解压 这里以D 盘为例进行说明 在D 盘中创建一个目录VTK 然后在其中创建4个目录 source build data和inst
  • mysql explain详解

    转自 http www blogjava net persister archive 2008 10 27 236813 html 在 explain的帮助下 您就知道什么时候该给表添加索引 以使用索引来查找记录从而让select 运行更快