new IndexWriter(Directory d, Analyzer a, boolean b);
b为true的时候意思是重建索引,也就是删除之前的索引重新建立索引。
b为false的时候意思是增量创建索引,就是该目录下有索引我就再创建一遍,没有的话就报错。
我做索引的时候就写的是ture。
我们先来看第一个阶段,MySQL慢的诊断思路,一般我们会从三个方向来做:
第一个方向是MySQL内部的观测
第二个方向是外部资源的观测
第三个方向是外部需求的改造
11 MySQL 内部观测
我们来看MySQL内部的观测,常用的观测手段是这样的,从上往下看,第一部分是Processlist,看一下哪个SQL压力不太正常,第二步是explain,解释一下它的执行计划,第三步我们要做Profilling,如果这个SQL能再执行一次的话, 就做一个Profilling,然后高级的DBA会直接动用performance_schema ,MySQL 57 以后直接动用sys_schema,sys_schema是一个视图,里面有便捷的各类信息,帮助大家来诊断性能。再高级一点,我们会动用innodb_metrics进行一个对引擎的诊断。
除了这些手段以外,大家还提出了一些乱七八糟的手段,我就不列在这了,这些是常规的一个MySQL的内部的状态观测的思路。除了这些以外,MySQL还陆陆续续提供了一些暴露自己状态的方案,但是这些方案并没有在实践中形成套路,原因是学习成本比较高。
12 外部资源观测
外部资源观测这部分,我引用了一篇文章,这篇文章的二维码我贴在上面了。这篇文章是国外的一个神写的,标题是:60秒的快速巡检,我们来看一下它在60秒之内对服务器到底做了一个什么样的巡检。一共十条命令,这是前五条,我们一条一条来看。
1uptime,uptime告诉我们这个机器活了多久,以及它的平均的负载是多少。
2dmesg -T | tail,告诉我们系统日志里边有没有什么报错。
3vmstat 1,告诉我们虚拟内存的状态,页的换进换出有没有问题,swap有没有使用。
4 mpstat -P ALL,告诉我们CPU压力在各个核上是不是均匀的。
5pidstat 1,告诉我们各个进程的对资源的占用大概是什么样子。
我们来看一下后五条:
首先是iostat-xz 1,查看IO的问题,然后是free-m内存使用率,之后两个sar,按设备网卡设备的维度,看一下网络的消耗状态,以及总体看TCP的使用率和错误率是多少。最后一条命令top,看一下大概的进程和线程的问题。
这个就是对于外部资源的诊断,这十条命令揭示了应该去诊断哪些外部资源。
13 外部需求改造
第三个诊断思路是外部的需求改造,我在这里引用了一篇文档,这篇文档是MySQL的官方文档中的一章,这一章叫Examples of Common Queries,文档中介绍了常规的SQL怎么写, 给出了一些例子。文章的链接二维码在slide上。
我们来看一下它其中提到的一个例子。
它做的事情是从一个表里边去选取,这张表有三列,article、dealer、price,选取每个作者的最贵的商品列在结果集中,这是它的最原始的SQL,非常符合业务的写法,但是它是个关联子查询。
关联子查询成本是很贵的,所以上面的文档会教你快速地把它转成一个非关联子查询,大家可以看到中间的子查询和外边的查询之间是没有关联性的。
第三步,会教大家直接把子查询拿掉,然后转成这样一个SQL,这个就叫业务改造,前后三个SQL的成本都不一样,把关联子查询拆掉的成本,拆掉以后SQL会跑得非常好,但这个SQL已经不能良好表义了,只有在诊断到SQL成本比较高的情况下才建议大家使用这种方式。
为什么它能够把一个关联子查询拆掉呢?
这背后的原理是关系代数,所有的SQL都可以被表达成等价的关系代数式,关系代数式之间有等价关系,这个等价关系通过变换可以把关联子查询拆掉。
上面的这篇文档是一个大学的教材,它从头教了关于代数和SQL之间的关系。然后一步步推导怎么去简化这句SQL。
第一,MySQL本身提供了很多命令来观察MySQL自身的各类状态,大家从上往下检一般能检到SQL的问题或者服务器的问题。
第二,从服务器的角度,我们从巡检的脚本角度入手,服务器的资源就这几种,观测手法也就那么几种,我们把服务器的资源全部都观察一圈就可以了。
第三,如果实在搞不定,需求方一定要按照数据库容易接受的方式去写SQL,这个成本会下降的非常快,这个是常规的MySQL慢的诊断思路。
MYSQL在创建索引后对索引的使用方式分为两种:1 由数据库的查询优化器自动判断是否使用索引;
2 用户可在写SQL语句时强制使用索引
下面就两种索引使用方式进行说明
第一种,自动使用索引。数据库在收到查询语句后会查看where语句后面的查询条件,同时查看在表上面有哪些索引,然后根据查询条件和索引进行匹配。
查询条件和索引的匹配包括查询字段与索引字段的匹配和查询类型和索引类型的匹配。前者很好理解,就是查询条件的属性上要建有索引,后者则是说查询条件必须能够使用索引,比如等值判断和范围查询可以使用B+树索引,而hash索引只能适用于等值判断。
在找到与查询条件匹配的索引后,就是进行代价估计来决定是否使用索引,代价估计主要根据要访问的就数量,一般来说如果通过索引访问的记录数量占全表记录数量15%以上,则不会使用索引而是使用全表扫描,因为此时使用索引的代价更大。在大多数情况下使用索引是会提高效率的。
经过优化器的判断,最终会决定是否使用索引
第二种,强制使用索引,主要是通过SQL语句实现的
select from table force index(PRI) limit 2;(强制使用主键)
select from table force index(ziduan1_index) limit 2;(强制使用索引"ziduan1_index")
select from table force index(PRI,ziduan1_index) limit 2;(强制使用索引"PRI和ziduan1_index")
也可以禁止索引的使用
select from table ignore index(PRI) limit 2;(禁止使用主键)
select from table ignore index(ziduan1_index) limit 2;(禁止使用索引"ziduan1_index")
select from table ignore index(PRI,ziduan1_index) limit 2;(禁止使用索引"PRI,ziduan1_index")你要什么结果?又不是查询语句。执行成功就是显示个 执行完成
你想要看有没有创建成功,展开表下面的+号,就可以看到个“索引”的项目,再点开看有没有就可以了。
或者你再运行下代码,提示索引已经存在就是之前已经创建成功了
是的。
下面三条语句都可以走索引,数据量在百万以上效果会非常明显。
select name from teacher;
select name from teacher where name = '123';
select name from teacher where name like '%123%';
使用 explain 可以看到语句是否使用索引。
name加过索引
remark未加索引,type=all,全表查询
可以用一下方式实现
借助navcat,或phpmyadmin,等工具,查看结构或设计表,点索引一栏就可以看到任何一张表穿件了什么索引了;
命令查看:mysql> show index from tblname;
mysql> show keys from tblname;
命令方式:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)