mysql排序

MySQL索引面试题分析

和自甴很熟 提交于 2020-02-17 11:26:22
MySQL索引面试题分析 话不多说,先建立一个表testTable,其中id为自增主键 在c1,c2,c3,c4上建立符合索引索引 CREATE INDEX idx_testTable_c1234 ON testTable ( c1 , c2 , c3 , c4 ) ; 现在的题目是:根据以下SQL分析索引使用的情况 1. SELECT * FROM testTable WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 = 'a4' ; 2. SELECT * FROM testTable WHERE c4 = 'a4' AND c3 = 'a3' AND c2 = 'a2' AND c1 = 'a1' ; 首先我们用explain语句来分析一下1,2条SQL语句 EXPLAIN SELECT * FROM testTable WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 = 'a4' ; EXPLAIN SELECT * FROM testTable WHERE c4 = 'a4' AND c3 = 'a3' AND c2 = 'a2' AND c1 = 'a1' ; 在这里我们看到它们的结果都是一样的,这是为什么呢? 其实,在MySQL逻辑架构中

性能调优 | 如何通过性能调优突破 MySQL 数据库性能瓶颈?

喜夏-厌秋 提交于 2020-02-16 07:15:30
本文出自头条号老王谈运维,转载请说明出处。 MySQL 数据库瓶颈对 DBA 程序员而言,是非常棘手的问题。要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?下面小编将从数据库数据库性能优化的目标和方法两方面阐述如何通过性能调优突破 MySQL 数据库性能瓶颈。 优化目标 减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。 降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标。 优化方法 改变 SQL 执行计划 明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标 order

MySQL 查询语句

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-15 02:27:55
排序查询 通过 ORDER BY 子句,可以将查询出的结果进行排序 ( 排序只是显示方式,不会影响数据库中数据的顺序 ) ASC: 升序,默认值 DESC: 降序 单列排序 只按某一个字段进行排序,单列排序。 SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC]; 如: -- 查询所有数据,使用年龄降序排序 select * from student order by age desc; 组合排序 同时对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依次类推。 SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC]; 如: -- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩升序排序 select * from student order by age desc, math asc; 聚合函数 平常我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询, 它是对一列的值进行计算,然后返回一个结果值。 聚合函数会忽略空值 NULL 。 五个聚合函数 SQL 中的聚合函数 作用 max( 列名 ) 求这一列的最大值 min( 列名 ) 求这一列的最小值 avg( 列名 )

MySQL explain命令详解

为君一笑 提交于 2020-02-13 21:02:30
使用explain + sql语句可以得到该条sql语句的执行计划,具体信息如下 下面将依次介绍每个字段的含义 id id表示在多表查询时,表的执行顺序,它是一组数字序列号,表示查询中执行select子句或操作表的顺序,其取值分为以下三种情况 1.id相同,表示表的执行顺序由上至下 上例中,表示该sql语句执行时对三张表的查询顺序是先查询t1,再查询t3,最后查询t3 2.id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 上例中,表示该sql语句执行时对三张表的查询顺序是先查询t3,再查询t2,最后查询t1 3.id有相同值也有不同值,id值越大越先被执行,id值相同自上而下顺序执行 上例中,t3表最先被查询,第二个被查询的并不是一张真实的表,而是一张衍生表derived2,它是表t3的查询结果,也就是将上一步中t3的查询结果作为一张表来进行查询,该衍生表的命名方式是derived+2(2 表示由 id =2 的查询衍生出来的表)。最后被查询的表是t2。 select_type select_type表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询,其值主要有以下几种情况 1.SIMPLE:简单的 select 查询,查询中不包含子查询或者UNION,实例如下 2.PRIMARY:查询中若包含任何复杂的子部分

[内功修神]MySQL高级

自古美人都是妖i 提交于 2020-02-12 15:16:04
个人博客文章地址 文章目录 1. mysql的架构介绍 1.2. Mysql逻辑架构介绍 2. 索引优化分析 2.1. 常见通用的join查询 2.2. 索引简介 2.2.1. 定义:排好序的快速查找数据结构 2.2.2. 优势 2.2.3. 劣势 2.2.4. mysql索引分类 2.2.5. mysql索引结构 2.2.6 哪些情况需要创建索引 2.2.7 哪些情况不要创建索引 2.3. 性能分析 2.3.1 MySQL Query Optimizer![在这里插入图片描述](https://img-blog.csdnimg.cn/20200212101223600.png) 2.3.2 MySQL常见瓶颈 2.3.3 Explain 2.3.3.1 是什么(查看执行计划) 2.3.3.2 能干嘛 2.3.3.3 怎么玩 2.3.3.4 各个字段解释 2.3.4 索引优化 2.3.4.1 索引失效(应该避免) 2.3.4.1 一般性建议 3. Mysql锁机制 3.1 锁的分类 3.2 三锁 3.2.1 表锁(偏读) 3.2.2 行锁(偏写) 3.2.3 页锁 4. 主重复制 1. mysql的架构介绍 1.2. Mysql逻辑架构介绍 查看命令 MyISAM和InnoDB 2. 索引优化分析 2.1. 常见通用的join查询 SQL执行顺序 join图 2.2. 索引简介 2

mysql数据库技术1——基本的增删查改的sql语句

爱⌒轻易说出口 提交于 2020-02-12 12:39:02
1、数据库语言的分类 DDL:数据库定义语言 data Definition language 用于创建、修改、和删除数据库内的数据结构,如: 1:创建和删除数据库(CREATE DATABASE || DROP DATABASE); 2:创建、修改、重命名、删除表(CREATE TABLE || ALTER TABLE|| RENAME TABLE||DROP TABLE,TRUNCATE TABLE); 3:创建和删除索引(CREATEINDEX || DROP INDEX) DML:数据操控语言 data Manipulation language 修改数据库中的数据,包括插入(INSERT)、更新(UPDATE)和删除(DELETE) DCL:数据控制语言 (管理用户权限)data Control language 用于对数据库的访问,主要包括创建用户、给用户授权、对用户撤销授权、查询用户授权和删除用户等 ,如:1.创建用户(create user)2:给用户授予访问权限(GRANT);3:取消用户访问权限(REMOKE),4删除用户(drop user)。 DQL:数据查询语言 data Query language 从数据库中的一个或多个表中查询数据(SELECT) 下面一一来介绍这四种类型的语言 2、DDL:数据库定义语言 data Definition

Mysql 基础(三)排序查询及常用函数

冷暖自知 提交于 2020-02-10 18:20:06
Mysql基础(三) 进阶三: 排序查询: 语法: select 查询列表 from 表 【where 筛选条件】 order by 排序的字段|表达式|函数|别名 【asc|desc】 特点: ​ 1、asc代表的是升序,desc代表的是降序,如果不写,默认是升序 ​ 2、order by 子句中可以支持多个字段,多个字段、表达式、函数、别名 ​ 3、order by 子句一般是放在查询语句的最后面,limit子句除外 语句执行顺序是: ​ 1、from 表 2、where 筛选条件、3、select 查询、4、order by 排序 #案例一:查询员工信息,要求工从高到低排序 SELECT * FROM employees ORDER BY salary DESC; #如果不写 ASC 或DESC,默认是升序 SELECT * FROM employees ORDER BY salary; #案例二【添加筛选条件】:查询部门编号>=90的员工信息,按入职时间的先后排序 SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC; #案例三【按表达式排序】:按年薪的高低显示员工的信息和年薪 SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM

【转】MySql索引

与世无争的帅哥 提交于 2020-02-10 15:21:32
https://segmentfault.com/a/1190000010991930 索引(key)是存储引擎用于快速找到记录的一种数据结构。它和一本书中目录的工作方式类似——当要查找一行记录时,先在索引中快速找到行所在的位置信息,然后再直接获取到那行记录。 在MySql中,索引是在存储引擎层而不是服务器层实现的,所以不同的存储引擎对索引的实现和支持都不相同。 B-TREE索引 B-TREE索引是使用最多的索引。很多存储引擎采用的都是B-TREE数据结构的变体实现该索引,例如InnoDB使用的是B+TREE,即每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点范围遍历。 不同存储引擎使用B-TREE索引的方式也不同。例如MyISAM使用前缀压缩技术使索引更小,而InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。 B-TREE中的所有值都是按顺序存储的,每个叶子页到根的距离相同。下图展示了InnoDB中的B-TREE索引是如何工作的: 当查找一行记录时,存储引擎会先在索引中搜索。从索引的根节点开始,通过比较节点页的值和要查找的值逐层进入下层节点,最底层叶子节点的指针指向的是被索引的数据。这样的查找方式避免了全表扫描,加快访问数据的速度。此外因为B-Tree对索引列是顺序存储的

mysql中文排序

三世轮回 提交于 2020-02-04 07:19:04
1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的。 这种情况在MySQL的很多版本中都存在。 如果这个问题不解决,那么MySQL将无法实际处理中文。 出现这个问题的原因是因为MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。 2.解决方法: 对于包含中文的字段加上”binary”属性,使之作为二进制比较,例如将”name char(10)”改成”name char(10)binary”。 如果你使用源码编译MySQL,可以编译MySQL时使用 –with–charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了(默认的是latin1)。也可以用 extra-charsets=gb2312,gbk 来加入多个字符集。 3. 如果不想对表结构进行修改或者重新编译MySQL,也可以在查询语句的 order by 部分使用 CONVERT 函数。 比如 select * from mytable order by CONVERT(chineseColumnName USING gbk); UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的

索引与优化

≡放荡痞女 提交于 2020-02-02 02:02:19
参考: http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针对5个字段设计了BTREE索引。 一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万条数据,平均每条数据源都重复大概10万次,表结构比较简单,仅包含一个自增ID,一个char类型,一个text类型和一个int类型,单表2G大小,使用MyIASM引擎。开始测试未添加任何索引。 执行下面的SQL语句: 1 mysql> SELECT id,FROM_UNIXTIME( time ) FROM article WHERE a.title= '测试标题' 查询需要的时间非常恐怖的,如果加上联合查询和其他一些约束条件,数据库会疯狂的消耗内存