数据库优化二

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

只有create、alter、drop三个语句带有table,这三个都是数据定义语言(DDL)
数据操作语言(DML):insert、update、delete则不需要带table这个词
insert into 表名 values
update 表名set ... [where]
delete from 表名[where]

注意:
1、一个表有外键,那个外键一定是另一个表的主键
2、修改带有外键表的表,那个外键字段一定要是外键表主键中存在的值

mysql优化
缓存方面:如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。

mysql使用基于成本的优化器,所以
MySQL认为的最优跟我们想的不一样(我们希望执行时间尽可能短,但MySQL值选择它认为成本小的,但成本小并不意味着执行时间短)

MySQL的查询优化器
重新定义表的关联顺序
优化MIN()和MAX()函数(找某列的最小值,如果该列有索引,只需要查找B+Tree索引最左端,反之则可以找到最大值
提前终止查询(比如使用LIMIT)
优化排序

选择数据类型只要遵循小而简单的原则就好,越小的数据类型通常会更快,占用更少的磁盘、内存,处理时需要的CPU周期也更少。

B+Tree就是一种多路搜索树。理解B+Tree时,只需要理解其最重要的两个特征即可:
第一,所有的关键字(可以理解为数据)都存储在叶子节点(Leaf Page),非叶子节点(Index Page)并不存储真正的数据,所有记录节点都是按键值大小顺序存放在同一层叶子节点上。
第二,所有的叶子节点由指针连接。

索引选择性是指不重复的索引值和数据表的总记录数的比值,选择性越高查询效率越高,因为选择性越高的索引可以让MySQL在查询时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
理解索引选择性的概念后,就不难确定哪个字段的选择性较高了,查一下就知道了,比如:
SELECT * FROM payment where staff_id = 2 and customer_id = 584
是应该创建(staff_id,customer_id)的索引还是应该颠倒一下顺序?执行下面的查询,哪个字段的选择性更接近1就把哪个字段索引前面就好。
select count(distinct staff_id)/count(*) as staff_id_selectivity,
count(distinct customer_id)/count(*) as customer_id_selectivity,
count(*) from payment

避免多个范围条件
实际开发中,我们会经常使用多个范围条件,比如想查询某个时间段内登录过的用户:
select user.* from user where login_time > ‘2017-04-01‘ and age between 18 and 30;
这个查询有一个问题:它有两个范围条件,login_time列和age列,MySQL可以使用login_time列的索引或者age列的索引,但无法同时使用它们。

原文地址:https://www.cnblogs.com/shigeng/p/8711125.html

时间: 2024-11-08 05:22:35

数据库优化二的相关文章

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头

数据库性能优化二:数据库表优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单介绍一下前三范式 先给大家看一下百度百科给出的定义: 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域

数据库SQL优化大总结之 百万级数据库优化方

http://tw.streetvoice.com/anssm001/songs/album/93124674/ http://tw.streetvoice.com/anssm001/songs/album/93124684/ http://tw.streetvoice.com/anssm001/songs/album/93124698/ http://tw.streetvoice.com/anssm001/songs/album/93124716/ http://tw.streetvoice.

MySQL 第八天(核心优化二)

一.昨天内容回顾 存储引擎 保存数据的格式(技术),不同格式体现特性不一样 myisam ① 结构.数据.索引 文件单独存储 ② 存入数据顺序(不考虑主键顺序) ,写入数据速度快 ③ 并发性,低,锁整张表 ④ 压缩机制 innodb ① 结构有单独文件,数据和索引合并到一个文件中 (通过设置,可以给每个表设置一个"数据/索引"文件) ② 存入数据顺序(给考虑主键值的先后顺序,数值大小排序存储) ③ 并发性,高,锁行 字段选择 ① 字段选取占据空间小的(bigint int medium

Mysql性能优化二

建立适当的索引 1.索引的原理说明 btree类型的索引,就是使用的二分查找法,肯定快啊,算法复杂度是log2N,也就是说16条数据查4次,32条数据查5次,64条数据查6次....依次类推.使用索引跟没使用索引的区别,就跟我们使用新华字典查字,一个是根据拼音或者笔画查找,一个是从头到尾一页一页翻. 2.索引的代价 磁盘占用 对dml(update delete insert)语句的效率影响 btree 方式检索,算法复杂度: log2N 次数 3.哪些列上适合添加索引 较频繁的作为查询条件字段

Oracle的SQL优化二

收到开发提交的一条SQL,在高并发下较慢,看能否做一些优化: 该SQL是1个表对另一个表做Left join,首先执行下看看, SQL> select l.vcno,opttype,add_points,optdate,remark,memid,id,FAMILYID,create_Username,billno,billtype,billsubcase,reduce_Points, l.addnum,addpresentum,reducenum,reducepresentnum 2  from

Zabbix优化二:Agentd主动模式

当主机数量过多的时候,由Server端去收集数据,Zabbix会出现严重的性能问题,主要表现如下: 1.Web操作很卡,容易出现502 2.图层断裂 3.开启的进程(Pollar)太多,即使减少item数量,以后加入一定量的机器也会有问题 所以下面主要往两个优化方向考虑: 1.用Proxy或者Node模式做分布式监控 2.调整Agentd为主动模式 由于第一个方案需要增加物理机器,所以先尝试第二方案 一.Agentd的配置调整: LogFile=/tmp/zabbix_agentd.log Se

saiku执行速度优化二

上一篇文章介绍了添加filter可以加快查询速度.下面继续分析: 下面这个MDX语句: WITH SET [~FILTER] AS {[create_date].[create_date].[2013-01-01]} SET [~ROWS_dimPartner_dimPartner] AS {[dimPartner].[dimPartner].[name].Members} SET [~ROWS_sight_sight] AS Hierarchize({{[sight].[sight].[cou

SPA页面缓存再优化二

部署到线上的步骤: 拿到打包之后的文件,删除服务器上的文件,再放上去的. 测试1: 更改js文件,删除并上传新包. 额外发现1:如果用户在上传期间,仍然在系统之内,此时即使将服务器上的包删除掉,用户不会跳出系统,只会在控制台上报错. 报错内容: 只是在报错服务器上没有指定的html文件 额外发现2: 已经被缓存了的页面html 刚进页面时会进行从服务器200取到,随后删除服务器的包,已经被缓存下来的html页面是可以正常操作的. 此时再上传新包,用户仍然在已经缓存的页面里,按照老系统正常跑.访问