mysql排序

mysql ------(order by ,聚合函数,group by,limit)

大兔子大兔子 提交于 2019-12-10 14:11:37
-- 1:数据库的查询(排序:order by) -- SELECT * FROM 表名 ORDER BY 排序字段 ASC(升序)|DESC(降序); -- 1.1 使用价格排序:升序 SELECT * FROM product ORDER BY price ASC; SELECT * FROM product ORDER BY price ;-- 默认就是升序 -- 1.2 使用价格排序:降序``````` SELECT * FROM product ORDER BY price DESC; -- 1.3 使用category_id排序:降序 -- 如果是对字符串排序,则使用的是字典顺序: admain about; SELECT * FROM product ORDER BY category_id ASC; -- 1.4 使用pname排序:升序 SELECT * FROM product ORDER BY pname ASC; -- order by 排序只对数字和英文字符串有效,对汉字无效 -- 1.5 在价格排序(降序)的基础上,以分类排序(降序) SELECT * FROM product ORDER BY price DESC, category_id DESC; -- 1.6 显示商品的价格(去重复 distinct),并排序(降序) SELECT

mysql使用索引优化order排序

核能气质少年 提交于 2019-12-10 08:18:31
个人原创地址: http://www.phpthinking.com/archives/433 在数据库中我们一般都会对一些字段进行索引操作,这样可以提升数据的查询速度,同时提高数据库的性能像order by ,group by前都需要索引。 先我们要注意一下 1>mysql一次查询只能使用一个索引。如果要对多个字段使用索引,建立复合索引。 2>在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。 关于索引一些说法 MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。 MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化。如果一个SQL语句形如: SELECT [column1],[column2],…. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order by 优化。 2、WHERE + ORDER BY的索引优化,形如: SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort];

排序应该在数据库还是在应用程序中进行?

旧街凉风 提交于 2019-12-10 01:51:14
在网站开发中,究竟是在数据库(DB)中排序好,还是在应用程序中排序更优,这一直是个很有趣的话题。DBANotes.net博主,在数据库方面比较有研究的冯大辉就这一问题日前和读者明灵(Dragon)做了探讨,本文是关于该问题的总结。 问:请列出在PHP中执行排序要优于在MySQL中排序的原因? 答:通常来说,执行效率需要考虑CPU、内存和硬盘等的负载情况,假定MySQL服务器和PHP的服务器都已经按照最适合的方式来配置,那么系统的可伸缩性(Scalability)和用户感知性能(User-perceived Performance)是我们追求的主要目标。在实际运行中,MySQL中数据往往以HASHtables、BTREE等方式存贮于内存,操作速度很快;同时INDEX已经进行了一些预排序;很多应用中,MySQL排序是首选。而在应用层(PHP)中排序,也必然在内存中进行,与MySQL相比具有如下优势: 1.考虑整个网站的可伸缩性和整体性能,在应用层(PHP)中排序明显会降低数据库的负载,从而提升整个网站的扩展能力。而数据库的排序,实际上成本是非常高的,消耗内存、CPU,如果并发的排序很多,DB很容易到瓶颈。 2.如果在应用层(PHP)和MySQL之间还存在数据中间层,合理利用的话,PHP会有更好的收益。 3.PHP在内存中的数据结构专门针对具体应用来设计,比数据库更为简洁、高效; 4

Mysql的order by和group by性能优化

女生的网名这么多〃 提交于 2019-12-09 23:53:16
一.提高order by 的速度: 1.查询时使用order by 的列尽量使用索引,避免出现fileSort; 2.order by 时 select * 是一个大忌,只取query需要的字段,这点非常重要,在这里影响的是: 当query 字段大小总和小于 max_length_for_sort_data 而且排序字段不是TEXT或BLOB类型时,会用改进后的算法:单路排序;否则用老算法:多路排序。 两种算法的数据都有可能超出sort_buffer 的容量,超出之后,会创建tmp文件进行合并排序,导致多次I/O,但是单路排序的算法风险会更大一些,所以要提高sort_buffer_size.3.尝试提高sort_buffer_size 不管用哪种算法,提高这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的。 3.尝试提高 max_length_for_sort_data 提高这个参数,会增加用改进算法的概率,但是如果设置的太高,数据总容量超出sort_buffer_size 的概率就会增大,明显症状是高的磁盘I/O活动和低的处理器使用率。 4.为排序使用索引: Mysql 两种排序方式:文件排序(fileSort)和扫描有序索引排序(using index); Mysql 能为排序与查询使用相同的索引; KEY a_b_c(a,b,c) 5.Order

Mysql优化之:group by、order by、distinct优化

时光怂恿深爱的人放手 提交于 2019-12-09 21:17:57
1.order by优化 实现方式: 1. 根据索引字段排序,利用索引取出的数据已经是排好序的,直接返回给客户端; 2. 没有用到索引,将取出的数据进行一次排序操作后返回给客户端。 EXPLAIN SELECT m.id,m.subject,c.content FROM group_message m,group_message_content c WHERE m.group_id = 1 AND m.id = c.group_msg_id ORDER BY m.user_id\G; optimizer对query进行了优化,它会按照m.user_id上的索引顺序来访问数据,这样获取的数据已经是排好序的。 这种利用索引实现数据排序的方法是 MySQL 中实现结果集排序的最佳做法,利用已有的索引避免实际的排序计算所带来的资源消耗。 如果没有用到索引,mysql就会将取出的数据按照一定的排序算法进行排序,然后再把排好序的数据返回给客户端。mysql中主要使用两种排序算法: 1. 取出用于排序的条件字段和指向相应数据行的指针,在sort buffer中对条件进行排序,排好序之后利用指针取出数据行中的请求数据,然后返回给客户端; 2. 取出用于排序的条件字段和其它所有请求数据,将不用于排序的字段存放在一块内存中,然后在sort buffer中对条件字段进行排序

PHP 中执行排序与 MySQL 中排序

放肆的年华 提交于 2019-12-09 20:48:42
此文首发在 InfoQ 中文站 。 作者:明灵(dragon) , Fenng . Note:要转载的朋友请注意注明这篇文章的第一作者! 这篇文章是dragon 朋友来邮探讨后他做的一个总结。在 DB 中排序还是在 应用程序中排序是个很有趣的话题,dragon 第一份邮件中其实已经总结的很好了,我添加了一点建议而已。现在放上来,与大家共享。这篇文章也投稿到了 InfoQ 中文站 。 Q:列出在 PHP 中执行排序要优于在 MYSQL 中排序的原因?给一些必须在MYSQL中排序的实例? A :通常来说,执行效率需要考虑 CPU、内存和硬盘等的负载情况,假定 MYSQL 服务器和 PHP 的服务器都已经按照最适合的方式来配置,那么系统的可伸缩性(Scalability)和用户感知性能(User-perceived Performance)是我们追求的主要目标。在实际运行中,MYSQL 中数据往往以 HASH tables、BTREE 等方式存贮于内存,操作速度很快;同时 INDEX 已经进行了一些预排序;很多应用中,MYSQL 排序是首选。而在应用层(PHP)中排序,也必然在内存中进行,与 MYSQL 相比具有如下优势: 1、 考虑整个网站的可伸缩性和整体性能,在应用层(PHP)中排序明显会降低数据库的负载,从而提升整个网站的扩展能力。而数据库的排序,实际上成本是非常高的,消耗内存

MySQL_数据查询

可紊 提交于 2019-12-07 16:12:30
目录 1.查看数据的两种方法 2.查看数据并进行筛选(where) 3.不查看重复记录(distinct),空值,非空值 5.查看指定行(limit) 6.模式匹配(like) regexp 6.范围查询(between and) 7.逻辑运算符查询 8.order by 子语句(排序) 9.group by 子语句(聚合函数) count()的用法 having(过滤) select <子句1> from <子句2> [where<表达式1>] [group<字句3>] [having<表达式2>] [order by<字句4>] [limit<子句5>] [union<操作符>] 1.查看数据的两种方法 select 字段名 from 表名; 查看多指定的字段 select 字段名,字段名 from 表名 2.查看数据并进行筛选(where) select 字段名 from 表名 where 字段名=字段值; 例如: select name from student where xb='f'; 我查看student表中,关于记录name(姓名)的字段 但是他要满足xb(性别)为f(男) 3.不查看重复记录(distinct),空值,非空值 不查看重复记录,多字段无效 select distinct 字段名 from 表名; 查看含有空值的记录 select *from 表名

array_multisort实现PHP多维数组排序示例讲解

╄→尐↘猪︶ㄣ 提交于 2019-12-07 15:36:30
array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 array_multisort — 对多个数组或多维数组进行排序 说明 bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] ) array_multisort (PHP 4, PHP 5) 如果成功则返回 TRUE,失败则返回 FALSE。 array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 关联(string)键名保持不变,但数字键名会被重新索引。 输入数组被当成一个表的列并以行来排序――这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。 本函数的参数结构有些不同寻常,但是非常灵活。第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。 排序顺序标志: SORT_ASC – 按照上升顺序排序 SORT_DESC – 按照下降顺序排序 排序类型标志: SORT_REGULAR – 将项目按照通常方法比较 SORT_NUMERIC – 将项目按照数值比较 SORT_STRING –

SQL优化

▼魔方 西西 提交于 2019-12-06 10:58:46
sq编写过程:   select dinstinct ..from ..join ..on ..where ..group by ...having ..order by ..limit .. sql解析过程:   from .. on.. join ..where ..group by ....having ...select dinstinct ..order by limit ... 避免索引失效 in可能造成索引失效,避免使用in或将in条件放置最后【where name = 'zs' and age in(23,25)】 复合索引使用顺序和创建顺序一致且不跨列使用(最佳左前缀) 复合索引经量全索引匹配(a、b、c全都用上) 避免在索引上进行操作(计算、函数、类型转换...) 复合索引比避免进行不等式判断(!=、<>)、或null判断(is null、is not null) like经量以常量开头,避免以%开头 避免使用or 多表查询 (数据量)小表驱动大表【where 小表.tid = 大表.tid(左小右大)】 索引建立在经常使用的字段上【左连接给左表加索引,右连接给右边加索引】 优化方法:   1.如果主查询数据量大使用in,如果子查询数据量大使用exists   2.order by优化 using filesort有两种算法:单路排序、双路排序(根据io次数判断

Mysql 排序规则选择

空扰寡人 提交于 2019-12-06 07:07:55
排序规则:是指对指定字符集下不同字符的比较规则。其特征有以下几点: 1、 两个不同的字符集不能有相同的排序规则 2、 两个字符集有一个默认的排序规则 3、 有一些常用的命名规则。如_ci结尾表示大小写不敏感(caseinsensitive),_cs表示大小写敏感(case sensitive),_bin表示二进制的比较(binary). utf-8有默认的排序规则: 命令:SHOW CHARSET LIKE 'utf8%'; 区别: utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。 utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会造成不良后果 utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容 utf8_general_ci校对速度快,但准确度稍差。 utf8_unicode_ci准确度高,但校对速度稍慢。 用一句话概况上面这段话:utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了 来源: https://www.cnblogs.com