索引问题

2019-12-10  本文已影响0人  JarvisTH

1.索引存储分类
索引是在MySQL的存储引擎层实现的,每个存储引擎的索引不一定相同。MySQL提供以下4种索引:

MySQL支持前缀索引,缺点是在排序order by和分组group by时无法使用。


2.MySQL如何索引
可以利用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。

(1) MySQL能够使用索引的典型场景:

(2)存在索引但不能使用索引典型场景:

(3)查看索引使用情况
若索引正在工作,则Handler_read_key的值将很高,这个值表示一个行被索引值读的次数,值低表明增加索引性能改善不高,即该索引并不经常使用。

Handler_read_rnd_next值高意味着查询运行低效,并且应该建立索引补救。这个值含义是在数据文件中读下一行的请求数。

3.优化方法

analyze [LOCAL|NO_WRITE_BINLOG|TABLE] tbl_name [,tbl_name]...

分析和存储表的关键字分布,分析结果将可以使得系统得到准确的统计信息,使得SQL能够生成正确的执行计划。分析期间,使用一个读取锁定对表进行锁定。对MyISAM、DBD和InnoDB表有作用。
检查表语法如下:

check table tbl_name [,tbl_name] ... [option]...option={QUICK|FAST|MEDIUM|EXDIUM|EXTENDED|CHANGED}

作用是检查一个或多个表是否有误,对MyISAM、InnoDB表有作用,也可以用于检查视图。

optimize [LOCAL|NO_WRITE_TO_BINLOG] table tbl_name[,tbl_name]...

如果已经删除表的一大部分,或者已经对含有可变长度行的表进行了很大更改,则应使用optimize table进行表优化。该命令可以将表空间碎片进行合并,支队MyISAM、BDB、InnoDB表有作用。在删除大量数据后,InnoDB表可以用alter table但不修改引擎方式回收不用空间。

4.常用SQL优化

alter table name disable keys;
loading the data
alter table name enable keys;

disable/enable keys用来打开/关闭MyISAM表非唯一索引的更新。

对于InnoDB类型,可以用以下几种方式提高导入效率:
(1)因为InnoDB类型表是按照主键顺序保存的,所以将导入的数据按照主键顺序排列,可以有效提高导入数据的效率。
(2)在导入数据前执行set unique_checks=0,关闭唯一性校验,导入完成后恢复唯一性校验。
(3)如果应用使用自动提交方式,导入前执行set autocommit=0,关闭自动提交,导入结束后打开自动提交。

insert into name values(1,1),(2,2)...

(2)如果从不同客户端插入很多行,可以通过使用insert delayed语句得到更高速度。delayed含义是让insert语句马上执行,其实数据都被放在内存队列中,并没有真正写入磁盘;low_priority刚好相反,在所有其他用户线程对表的读写完成后进行。
(3)将索引和数据文件分布在不同磁盘是存储。
(4)如果进行批量插入,可以增加bulk_insert_buffer_size提高速度,只能对MyISAM使用。
(5)当从一个文本文件装入一个表时,使用load data infile。通常比使用insert快。

尽量减少额外排序,通过索引直接返回有序数据。

MySQL通过比较,max_length_for _data大小和query语句取出字段中大小来判断使用哪种排序。如果max_length_for _data值更大,使用第二种优化后的算法,否则就是要第一章算法。


(2)第二种优化思路:把limit 查询转换成某个位置的查询,和开发协商,在翻页过程中增加一个参数last_page_record,用来记录上一页最后一行租赁编号。把limit m,n转换成limit n查询,只适合在排序字段不会出现重复值的特定环境,能够减轻分页翻页压力;如果排序字段出现大量重复值,不适合这种方式优化。

上一篇下一篇

猜你喜欢

热点阅读