mysql排序

索引原理与慢查询优化(2)

丶灬走出姿态 提交于 2020-01-01 07:27:14
七 正确使用索引 一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like、 大于号、小于号 不等于!= between ...and... like 2 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录 #先把表中的索引都删除,让我们专心研究区分度的问题 #先把表中的索引都删除,让我们专心研究区分度的问题 mysql> desc s1; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id

MySQL中rank函数如何实现

馋奶兔 提交于 2020-01-01 06:38:36
MySQL中不存在类似于SQL Server或Orcal中的rank()函数来得到排名。而在实际的工作中,常常需要将查询后排序得到的排名给记录下来。由于项目需要,不仅要对成绩进行排名,而且需要相同成绩的具有相同的排名。根据网上的提供的排名方法,进一步进行扩充,得到了下面的实现方式。 表:score,有三个字段,id,name,score 表中原始数据: SQL代码: select tmp.id,tmp.name,tmp.score, -- 顺序一直在变大 @j:=@j+1 as j, -- 只有在前后二次排序值不同时才会使用顺序号 @k:=(case when @pre_score=tmp.score then @k else @j end) as rank, @pre_score:=tmp.score as pre_score from ( -- 成绩排序 select * from score order by score desc ) tmp, -- @k 表示最终的排名(相同值时序号相同) -- @j 表示顺序排名 -- @pre_score上一次排序值 (select @k :=0,@j:=0, @pre_score:=0) sdcore 排序后的结果: 来源: https://www.cnblogs.com/bjwylpx/p/5345162.html

mysql 排序后获取某一行的位置

与世无争的帅哥 提交于 2020-01-01 05:41:56
表test中现有数据 id score 1 10 2 5 3 15 执行sql select id,score,(@rowno:=@rowno+1) as rowno from test,(select (@rowno:=0)) b order by score desc; 获得如下结果 id score rowno 3 15 1 1 10 2 2 5 3 然后在此基础上查询某条记录的位置 select rowno from (select id,score,(@rowno:=@rowno+1) as rowno from test,(select (@rowno:=0)) b order by score desc) c where id = 1; 这样就可以查到id为1的记录的排序为2 参考: http://blog.csdn.net/sugang_ximi/article/details/6703804 来源: https://www.cnblogs.com/ykt8465279130/p/3624012.html

mysql索引原理与慢查询优化2

一曲冷凌霜 提交于 2020-01-01 04:56:52
七 正确使用索引 一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like、 大于号、小于号 不等于!= between ...and... like 2 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录 #先把表中的索引都删除,让我们专心研究区分度的问题 #先把表中的索引都删除,让我们专心研究区分度的问题 mysql> desc s1; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id

数据库索引

旧街凉风 提交于 2020-01-01 04:22:24
以下索引知识以mysql索引来阐述 一:MySQL中索引的语法   (1)创建索引 --在创建表的时候添加索引 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); --在创建表以后添加索引 ALTER TABLE my_table ADD [UNIQUE] INDEX index_name(column_name); --或者 CREATE INDEX index_name ON my_table(column_name); 注意: 1、索引需要占用 磁盘空间 ,因此在创建索引时要考虑到磁盘空间是否足够 2、创建索引时需要 对表加锁 ,因此实际操作中需要在业务空闲期间进行    (2)索引相关sql --删除索引 DROP INDEX my_index ON tablename; --或者 ALTER TABLE table_name DROP INDEX index_name; --查看表中的索引 SHOW INDEX FROM tablename --查看查询语句使用索引的情况 //explain 加查询语句 explain SELECT * FROM table_name WHERE column_1='123

(七)MySQL索引和执行计划

不羁岁月 提交于 2020-01-01 04:22:05
索引 和 EXPLAIN/DESC 概念 索引 是对 数据库 表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息 索引分为聚簇索引和非聚簇索引两种 聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 MyISAM:非聚簇索引 非聚簇索引的 主索引和辅助索 引几乎是一样的,只是主索引不允许重复,不允许空值,他们 的叶子结点的key都存储指向键值对应的数据的物理地址 非聚簇索引的数据表和索引表是分开存储的 非聚簇索引中的数据是根据数据的插入顺序保存。因此非聚簇索引更适合单个数据的查询。插入顺序不受键值影响 只有在MyISAM中才能使用FULLTEXT索引 InnoDB:聚簇索引 聚簇索引的 主索引的叶子结点存储的是键值对应的数据本身,辅助索引的叶子结点存储的是键值对应的数据的主键键值 。因此主键的值长度越小越好,类型越简单越好 聚簇索引的数据和主键索引存储在一起。 聚簇索引的数据是根据主键的顺序保存。因此适合按主键索引的区间查找,可以有更少的磁盘I/O,加快查询速度。但是也是因为这个原因,聚簇索引的插入顺序最好按照主键单调的顺序插入,否则会频繁的引起页分裂,严重影响性能。 在InnoDB中

开发中用到的一个快速排序法

北慕城南 提交于 2019-12-23 10:15:36
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 实际上在,做web开发,比较少遇到使用一些算法之类的,毕竟不是做搜索引擎,也不是写底层(比如写个类似于mysql这样的数据库,里面需要自己实现排序算法),另外,每种语言,比如java,php都或多或少已经封装好排序函数给程序员使用。比如有个共识, 大家做web开发的基本都明白,业务逻辑多比较简单,不是很复杂的业务逻辑。 我们作为web开发的程序员,基本是是web架构,对数据库增删查改数据,然后把数据展示在页面中,大多就是涉及性能优化,缓存等等。 学学一些常见的算法,对于实现特殊的应用还是有帮助的。比如有些时候我们依赖于数据库中order by来实现排序了,所以非常习惯直接接下交给数据库实现排序了。 接下来,我就遇到需要自己实现排序了。 因为我们在实际开发中,遇到一个问题,完全需要我自己实现排序。需求如下: 在商品表里面,有一个字段是goods_price(商品价格),现在要开发一个促销价功能。促销价有个时间范围设置。在前台页面中,展示商品的时候。如果当前时间符合促销时间。就要按照促销价格执行。于是促销价就单独增加了一个字段来保存,叫做promote_price,促销时间配置信息比如什么时间,每天几点到几点之类的时间设置信息暂时不管,存储在其他字段中的,展示的时候,要用当前时间跟配置的时间进行比较。

mysql数据,通过logstash同步到elasticsearch,数据丢失

六眼飞鱼酱① 提交于 2019-12-23 08:28:23
测试同学反馈,某业务商品数据查询不到,但数据库里面存在。 我们商品数据,从es中查询的。通过logstash,将mysql里面的数据同步到es中。 查看了下es中,该数据确实不存在。 重新构建index 然后做了一次全量数据同步,发现es中的数据总量低于mysql中数据源的数据总量。 原因: sql有问题。数据查询sql,未指定排序。使用的默认排序,库表使用的InnoDB引擎。 当数据发生delete、update时,排序会发生变化。 后来指定根据主键排序,数据同步正常。es中数据和mysql数据量一样 来源: CSDN 作者: 【随风飘流】 链接: https://blog.csdn.net/LG772EF/article/details/103635898

Mysql—详解排序和分页(order by & limit)及存在的坑(八)

笑着哭i 提交于 2019-12-21 14:57:53
文章目录 一、详解排序查询(order by) 二、详解分页查询(limit) 三、常见的坑 今天和大家聊聊数据查询中常使用到的两个查询,排序和分页查询。 | 声明:本文中被[]包含的表示可选项,|符号分开的表示可选其一。 一、详解排序查询(order by) 电商中:我们想查看今天所有成交的订单,按照交易额从高到低排序,此时我们可以使用数据库中的排序功能来完成。 排序语法: select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc]...; 说明: 需要排序的字段跟在 order by 之后; asc | desc 表示排序的规则。 asc:升序 ; desc:降序 。默认为 desc降序 支持多个字段进行排序,多字段之间用 逗号 隔开。 1、单字段排序 2、多字段排序 3、按别名排序 4、按函数排序 有个学生表(id:学号,birth:出生日期,name:姓名),如下: 需求:按照出生年份升序、编号升序,查询出编号、出生日期、出生年份、姓名,2种写法,如下: 说明: year()函数:输入日期函数,可以获取对应日期中的年份; 上面使用了两种方式排序,第一张是在order by后面使用了函数;第二种使用了别名排序 5、where之后进行排序 有订单数据如下: 需求:查询订单金额 >= 100的,按照订单金额降序排序

mysql中的order by

六眼飞鱼酱① 提交于 2019-12-21 07:03:16
一、order by的原理 1、利用索引的有序性获取有序数据 当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 range,ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。这种方式的 order BY 基本上可以说是最优的排序方式了,因为 MySQL 不需要进行实际的排序操作,需要注意的是使用索引排序也有很多限制。 当对连接操作进行排序时,如果ORDER BY仅仅引用第一个表的列,MySQL对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySQL必须将查询的结果集生成一个临时表,在连接完成之后进行filesort操作,此时,EXPLAIN输出“Using temporary;Using filesort”。 注意: MySQL在查询时最多只能使用一个索引。因此,如果WHERE条件已经占用了索引,那么在排序中就不使用索引了 mysql> show create table test \G *************************** 1. row *************************** Table: test Create Table: CREATE TABLE