mysql排序

MySQL高性能的索引策略(四)

允我心安 提交于 2019-12-01 21:28:19
MySQL高性能的索引策略(四) 使用索引扫描来做排序 mysql有两种方式可以生成有序的结果: 通过排序操作;或者通过索引顺序扫描; 如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序(不要和Extra 列的“using index”搞混淆了)。 扫描索引本身是很快的,因为只需从一条记录移动到紧接着的下一条记录。 但如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就得回表查询一次对应的行。这基本上都是随机IO,因此按索引顺序读取数据的速度通常比顺序的全表扫描慢,尤其是在IO密集型的工作负载时。 mysql可以使用同一个索引既满足排序,又用于查找行。 因此如果可能,设计索引时应该尽可能的满足这两种任务。 只有当索引的列的顺序和order by子句的顺序完全一致,并且所有列的排序方向(倒序和正序)都一样时,mysql才能使用索引来对结果做排序。 如果查询需要关联多张表,则只有order by子句引用的字段全部为第一个表时,才能使用索引来做排序。 order by子句和查找型查询的限制时一样的: 需要满足索引的最左前缀的要求; 否则,mysql都需要执行排序操作,而无法利用索引排序。 有一种情况下order by子句可以不满足索引的最左前缀要求,就是前导列为常量的时候。 如果where子句或者join子句中对这些列指定了常量

查看数据库字符集和排序规则

青春壹個敷衍的年華 提交于 2019-12-01 18:23:09
查看数据库字符集 mysql> show charset; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European |

Mysql Explain的使用

半世苍凉 提交于 2019-12-01 13:58:16
explain的作用 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 1. id 1.)id相同 (按顺序执行) EXPLAIN SELECT * FROM resource, deployment, resource_bundle WHERE resource.deployment_id = deployment.id AND resource.resource_bundle_id = resource_bundle.id AND resource.id = '00274ec2-d273-4a10-88c1-9817e067f9e6'; 2.)id不同(递增,序号越大越先执行) EXPLAIN SELECT * FROM deployment_allocation_bundle WHERE deployment_id = (SELECT id FROM deployment WHERE id = (SELECT resource.deployment_id FROM resource WHERE id = '00274ec2-d273-4a10-88c1-9817e067f9e6')); 3.)id有相同和不同(序号 越大越先执行,出现相同的则按顺序执行 ) EXPLAIN SELECT deployment

Mysql排序函数

给你一囗甜甜゛ 提交于 2019-12-01 13:58:00
一、row_number row_number会为查询出来的每条记录生成一个序号,依次排序并且不会重复,row_number必须要使用over句子选择对某一列进行排序才会生成序号,row_number用法实例: select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num,* from [Order] row_num就是row_number函数生成的序号列,其基本原理是先使用over子句中的排序语句对记录进行排序,然后按照这个顺序生成序号。over中的order by和SQL语句中的order by没有任何的关系,这两处的order by可以完全的不同,例如下述的用法: select ROW_NUMBER() OVER(order by [SubTime] desc) as row_num,* from [Order] order by [TotalPrice] desc row_number函数可以实现web程序的分页,查询制定范围内的数据,例如根据订单提交时间倒序排列获取第三至第五数据: with orderSection as ( select ROW_NUMBER() OVER(order by [SubTime] desc) rownum,* from [Order] ) select * from

MYSQL窗口函数用法及区别

佐手、 提交于 2019-12-01 13:53:49
本博客转自: https://blog.csdn.net/weixin_34384915/article/details/87551597 窗口函数(OLAP 实时分析处理函数) ,可以一般聚合函数无法实现的高级操作。诸如排序、生成序列号等功能。目前 DBMS 逐步都完成了对窗口函数的支持,唯独 MySql 不支持(但是 Mysql 8 开始支持了)。 1. 窗口函数语法: <窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>) 语法解释: 窗口函数分两类 (1.能够作为窗口函数的聚合函数 2.RANK、DENSE_RANK、ROW_NUMBER 等专用窗口函数) PARTITION BY : 设定排序的对象范围 ORDER BY : 指定按照哪一列、何种顺序进行排序 2. 专有开窗之一 (RANK函数)、快速了解开窗函数使用 RANK函数 : 用于计算记录排序的函数 例子表 需求: 根据不同的商品种类(product_type),按照销售单价(sale_price) 从低到高的顺序排序 ? 答案解析 总结 :PARTITION BY 横向对表进行分组、ORDER BY 决定纵向排序的规则。通过 PARTITION BY 分组后的集合称为窗口。 2.1 不使用 PARTITION BY 情况下: 例子

索引补充,命中索引

最后都变了- 提交于 2019-12-01 06:17:35
1、索引   索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2、索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null) 组合索引:多列值组成一个索引, 专门用于组合搜索,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索 索引合并,使用多个单列索引组合搜索 覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖 3、相关命令 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 - 查看表结构 desc 表名 - 查看生成表的SQL show create table 表名 - 查看索引 show index from 表名 - 查看执行时间 set profiling = 1; SQL... show profiles; 4、使用索引和不使用索引 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 由于索引是专门用于加速搜索而生,所以加上索引之后,查询效率会快到飞起来。 # 有索引 mysql> select * from tb1 where name = 'wupeiqi-888' ; + ----

12、排序

我的未来我决定 提交于 2019-12-01 06:17:31
排序 使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。 语法 SELECT field1, field2,...fieldN FROM table_name1, table_name2... ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]] 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。 你可以设定多个字段来排序。 你可以使用 ASC 或 DESC 关键字来设置查询结果是按 升序 或 降序 排列。 默认情况下,它是按升序排列。 你可以添加 WHERE...LIKE 子句来设置条件。 实例 mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC; +-----------+--------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+--------------+---------------+-----------------+ | 3 | JAVA 教程 | RUNOOB

MySql学习系列(一)

蓝咒 提交于 2019-12-01 04:45:54
学习内容 1、软件安装及服务器设置。 2、使用图形界面软件 Navicat for SQL 简易步骤: 解压缩文件,复制key 打开文件夹中的navicat.exe 用户名随意,输入key,然后连接数据库 输入密码,连接名改成自己喜欢的 剩下的自己探索,怎么在navicat中创建数据库、表等等 3、数据库基础知识 数据库定义 关系型数据库 二维表 行 列 主键 外键 4、MySQL数据库管理系统 数据库 数据表 视图 存储过程 1.1MySQL 软件安装及数据库基础 1.软件安装及服务器设置。 教程 http://www.runoob.com/mysql/mysql-install.html 登录 MySQL: 当 MySQL 服务已经运行时, 我们可以通过 MySQL 自带的客户端工具登录到 MySQL 数据库中, 首先打开命令提示符, 输入以下格式的命名: mysql -h 主机名 -u 用户名 -p 参数说明: -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略; -u : 登录的用户名; -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。 如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可: mysql -u root -p 按回车确认,

学习MySQL官方文档(一)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-01 04:44:20
前提:看这篇文档之前我已经装了一台虚拟机,并在虚拟机上装好了mysql服务,还装了Navicat并连接上虚拟机的mysql服务 1、连接到服务器和从服务器断开连接 shell> mysql - h host - u user - p Enter password: * * * * * * * * Welcome to the MySQL monitor . Commands end with ; or \g . Your MySQL connection id is 25338 to server version: 5 . 7 . 29 - standard Type 'help;' or '\h' for help . Type '\c' to clear the buffer . mysql> host是要连接的服务器的ip,如果是在运行MySQL的同一台计算机上登录,则可以省略主机,只需使用以下命令: shell> mysql - u user - p 如果在尝试登录时收到诸如ERROR 2002(HY000)之类的错误消息 :无法通过套接字’/tmp/mysql.sock’(2)连接到本地MySQL服务器,则意味着该MySQL服务器守护程序(Unix)或服务(Windows)未运行。 从服务器断开连接 mysql> QUIT Bye 2

Mysql文档记录

天涯浪子 提交于 2019-12-01 04:13:41
一、语言结构 字符串是一个字节或字符序列,包含在单引号(’)或双引号(")字符中 符串文字可以具有可选的字符集介绍人和COLLATE子句,以将其指定为使用特定字符集和排序规则的字符串 [_charset_name]‘string’ [COLLATE collation_name] SELECT _latin1’string’; SELECT _binary’string’; SELECT _utf8’string’ COLLATE utf8_danish_ci; 有几种方法可以在字符串中包含引号字符: 一个’带引号的字符串中 '可以写成 ‘’ 一个"带引号的字符串中 "可以写成 “” 通过转义字符(\)来引用引号字符 一个’带引号的字符串内 “不需要特殊对待而且不必增加一倍或逃脱。以同样的方式,” 引用的字符串里面’不需要特殊处理。 合法的比特值文字:b’01’ B’01’ 0b01 对于排序方式ORDER BY, NULL值在升序排序的其他值之前排序,在降序排序的其他值之后排序 除非非限定引用不明确,否则无需在语句中为对象引用指定限定符。假设列c1只在表中出现 t1,c2只在 t2和c两 t1和t2。任何非限定引用c在引用两个表的语句中都是不明确的,必须限定为 t1.c或t2.c表示您的表 此语句使用限定名称创建表 db1.t1:CREATE TABLE db1.t1 (i