mysql优化和索引_mysql优化和索引

表的优化

1.定长与变长分离

如 int,char(4),time核心且常用字段,建成定长,放在一张表;

而varchar,text,blob这种变长字段适合单放一张表,用主键与核心表关联。

2.常用字段和不常用字段要分离

3.在 1 对多需要关联统计的字段上,添加冗余字段。

列类型选择原则

1.字段类型优先级  整型 > date,time > enum,char > varchar > blob,text

2.够用就行,不要慷慨,大的字段浪费内存,影响速度。

3.尽量避免用NULL,NULL不利于索引,需要特殊的字节来标注。

Enum列的说明

1.enum列在内部是用整型来存储的

2.enum列和enum列想关联速度最快

3.enum列比(var)char的弱势--在碰到与char关联时,要转化,要花时间

4.优势---当char非常长时,enum依然是整型固定长度,当查询的数据量越大时。enum的优势越明显。

索引优化

B-tree索引:myisam,innodb中默认使用B-tree索引。

hash索引:在memory表里,默认使用hash索引。

hash优缺点:1.查询时间复杂度为O(1)。

2.hash计算的结果是随机的,在磁盘上也是随机放置。

3.无法对范围查询进行优化;

4.无法利用前缀索引;

5.排序也无法优化;

6.必须回行,就是说,通过索引拿到数据位置必须回到表中取数据。

在where条件常用的列上都加上索引,若是独立的索引,同时只能用上1个。

若建立多列索引,index(a,b,c),注意和顺序有关,索引发挥作用,需要满足左前缀要求。

索引在where,order by,group by 中会用上(满足左前缀要求)。

多列索引在实际应用中更加实用,注意在建立多列索引的时候,要结合实际,创建合理的索引。

索引提高查询的速度、提高排序的速度、提高分组查询的速度。

聚簇索引和非聚簇索引

聚簇索引:btree

innodb引擎,索引和数据是在一块的,

innodb直接在主键索引的树中,储存行的数据,(既存储了主键值,又存储了行数据)。

innodb次索引指向对主键的引用。

优点:根据主键查询条目比较少时,不用回行(数据就在主键节点下)。

缺点:如果碰到不规则数据插入时,造成频繁的页分裂。

非聚簇索引:btree

myisam引擎, 索引和数据是分开的,

myisam索引指向行在磁盘上的位置

myisam中,主索引和次索引都指向物理行(磁盘位置)。

索引覆盖:

如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据。

索引与排序对于覆盖索引,直接在索引上查,就是有序的;

在innodb引擎上,沿着索引的字段排序,也是自然有序的,对于myisam引擎,按某索引字段排序,但取出的字段包含有不是索引字段,那么会先取出所有行,再进行排序。

先取出数据,形成临时表,做filesort文件排序(要尽可能避免)。

争取目标:取出来的数据本身就是有序的,利用索引来排序。

SQL语句优化SQL语句的时间花在等待时间、执行时间,只有降低执行时间,那其他语句锁定的时间也减少了;

SQL语句的执行时间又花在查找、取出;

如何查询快?a)联合索引的顺序、区分度、长度 b)取得快,索引覆盖 c)传输的少,更少的行和列;

切分查询,将数据拆成多次,例:插入10000条数据,每1000条为单位插入;

分解查询,按逻辑把多表连接查询分成多个简单SQL

总结:少查,尽量精准数据,少取行;必须要查,尽量走在索引上查询行;取时,取尽量少的列;

在group时,用带有索引的列来group,可以避免临时表和文件排序,速度会稍快些,另外用int型比char型分组,也要快些;

在group时,我们假设只取了A表的内容,group by的列,尽量用A表的列,会比B表的列要快。

order by的列要和group by 的列一致,否则也会引起临时表,因为两者都需要排序,如果两者的列不一致,那必须经过至少1次排序;

如何判断查询是否用到了索引?

查询方法:  explain  SQL  \G

extra字段:

using index: 指用到了索引覆盖,效率非常高;

using where:指光靠索引还定位不到,还得where判断一下

using temporary:指用上了临时表,group by 与 order by 不同列时或 group by 、order by 别的表的列时

using filesort:文件排序,文件可能在磁盘,也可能在内存。

子查询

1.from型子查询

注意:内层from语句查到的临时表,是没有索引的,所以from的返回内容要尽量少,需要排序,在内层先排好序。

2.in型子查询

mysql的查询优化器,针对in型优化,被改成exists子查询的执行效果,单行单行的执行过滤。当外层表越大时,查询速度越慢。可以用连接查询来代替子查询。

limit及翻页优化

limit offset,N

当offset非常大时,效率很低,因为mysql先取offset+N行,返回放弃前offset行,返回N行。

优化办法:

1)从业务上去解决,不允许翻过100页。例如百度,一般能翻到70多页。

2)不用offset,用条件查询(ID上有索引)

select * from tablename where id>1000000 limit 2;

3)只查索引,不查数据,得到ID,再用ID去查具体条目(ID上有索引),这种技巧就是延迟关联

select id,xxx,xxx from tablename inner join (

select id from tablename limit 1000000,2 ) as tmp using(id);

比下面直接查数据的方法快,

select id,xxx,xxx from tablename limit 1000000,2;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】为什么不能使用字符流读取非文本的二进制文件?

读取文件 刚学Java的IO流部分时,书上说只能使用字节流去读取图片、视频等非文本二进制文件,不能使用字符流,否则文件会损坏。所以我就一直记住这一点了,但是为什么不能使用,这一直是我的一个疑惑。今天,我…

mysql更新一条语句_MySQL一条更新语句是如何执行的

一条查询语句是经过连接器 分析器 优化器 执行器等功能模块,最后到达存储引擎。image以下所说的都基于InnoDb引擎。当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。InnoDb…

【转】文本文件和二进制文件区别及java中字节流和字符流归纳

首先在物理上文本文件和二进制文件并没有区别,都是以二进制01的形式存放于存储介质中,他们的区别只是逻辑上的区别,这两种方式只是在编码层次上有差别。文本文件是基于字符编码的文件,常见的编码有ASCII编码…

mysql查询后从高到低排序_[MySQL基础]三、排序查询

排序查询语法:SELECT查询列表FROM表[WHERE 筛选条件]ORDER BY 排序列表 [ASC|DESC]; #[ ]中的内容表示可选特点:asc代表的是升序,desc代表的是降序,如果不写,默认是升序order by子句中可以支持单个字段、多个字段、表达…

【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)

转自:http://blog.csdn.net/jiangqin115/article/details/42684017 UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动…

cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标

1. 由世界坐标转模型坐标顶点着色器:attribute vec3 position3DHigh;attribute vec3 position3DLow;attribute vec3 normal;attribute vec2 st;attribute float batchId;varying vec3 v_positionEC;varying vec3 v_normalEC;varying vec2 v_st;void main(){vec3 pos…

【转】关于CLR内存管理一些深层次的讨论[上篇]

半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此,今天按照PPT的内容写了一篇文章。本篇文章不会再讨论…

mysql数据库连接地址utf8_在Python中连接到MySQL数据库时UTF8不工作

我正在努力使Python更好地使用UTF-8编码的MySQL数据库,例如,挪威字符。我找了好几个小时,但没能找到像预期的那样有效的东西。以下是从数据库中提取的示例表:mysql> select * from my_table;---------------------| id | shop_…

【转】.NET Remoting

.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销. 中文名 .Net Remoting 作 用 减轻运行应用程序的系统开销 目录 1 介绍2 .NET Remoting的原理 ▪ 1.NET Rem…

python多重赋值技巧_python教程12课:多元赋值、多重赋值、运算符以及判断字符串类型...

# 多元赋值:# x,y,z 和 1,2,‘String是两个元组,只不过元组的 () 被省略掉了x, y ,z 1, 2, Stringprint(x, y, z)(x, y ,z) (3, 4, String)print(x,y,z)# 一般用在交换变量值#交换变量值常规思路x 10,y 20z 30x ,y, z y,z,xprint(x,y,z)#使用多元赋值…

【转】关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方式);以及基于进程范围内的字符串驻…

python正则表达式处理txt_Python文本处理服务(re正则表达式例子)

正则表达式例子检查对子在此示例中,我们将使用以下帮助函数来更优雅地显示匹配对象:def displaymatch(match): if match is None: return None return % (match.group(), match.groups())假设你在写一个扑克程序,一个玩家的一手…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

理解堆与栈 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型 深入浅出图…

bi 存储过程方案_BI 系统中容易被忽视的数据源功能

BI 系统中容易被忽视的数据源功能用户在选购 BI 解决方案的时候,常常会更关注界面环节的功能指标,比如美观性、操作的流畅性、移动端支持等等。毕竟,BI 是要给业务人员使用的,这些看得见的内容一般不容易被遗漏。然而,…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型 深入浅…

matlab将二值图像与原图重叠_图像处理matlab及图像融合图像镶嵌图像拼接

要把double的图像(范围是0到1)再次转化为256灰度值的,可以这样Igrey uint8(I2*255)图像类型转换函数:dither() 通过颜色抖动,把真彩图像转换成索引图像或灰度图象转换成二值图像gray2ind() 将灰度图像(或二值图像)转换成索引图像grayslice() …

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 本文将介绍值类型与引用类…

mysql udf sm4_SM4国密算法Java版

根据 国密SM4 文档 编写的一个Java 加密解密样例package javasm4;/**** author Jeen*/public class JavaSM4 {public static int[] key new int[4];//密钥public static int[] temp new int[4];//中间量 存储运算结果public static int[] rkey new int[32];//轮密钥public s…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)

一、垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤: 调用中间语言(IL)中的newobj指令,为表示某个特定资源的类型实例分配一定的内存空间。初始化上一步所得的内存,设置资源的初始状态,从而…

gperftools mysql_利用 gperftools 对nginx mysql 内存管理 性能优化

利用 gperftools 对nginx 与 mysql 进行 内存管理 性能优化 降低负载.Gperftools 是由谷歌开发。官方对gperftools 的介绍为:These tools are for use by developers so that they can create more robust applications. Especially of use to those developing m…