mysql排序

Mysql-explain之Using temporary和Using filesort解决方案

家住魔仙堡 提交于 2019-12-01 02:30:51
项目刚刚告一段落,boos又让优化几个主要界面 程序代码方便的优化就不讲了,主要说MySQL的优化 首先查看explain执行计划,让主要查询语句使用索引,索引type级别最好达到ref | ref_eq级别 其次将extra一栏的Using temporary(临时表)、Using filesort(文件排序)拖出去砍了 第一条语句 explain select * from tb_wm_shop where is_delete != 1 and is_authentication = 1 ORDER BY create_time DESC 大家应该知道使用order by的 字段要使用索引,这条语句中create_time已经创建了索引,但是计划中并没有使用该索引,导致出现了Using filesort文件排序,使其查询变慢 解决方法如下: 从where条件开始,依照顺序创建一个组合索引,就可以砍掉Using filesort这个令人讨厌的头颅了 注意:必须依照顺序,在创建组合索引时,where条件的字段在orderBy的字段之前,如果orderBy是多字段,则必须依照顺序创建 详情可参考链接: https://blog.csdn.net/dingxingmei/article/details/49096591 第二条语句 explain select s.* from tb

MySQL实战45讲学习笔记:“order by”是怎么工作的?(第16讲)

主宰稳场 提交于 2019-11-30 18:47:00
一、今日内容概要 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按 照姓名排序返回前 1000 个人的姓名、年龄。 假设这个表的部分定义是这样的: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`) ) ENGINE=InnoDB; 这时,你的 SQL 语句可以这么写: select city,name,age from t where city='杭州' order by name limit 1000 ; 这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么执行的,以及有什么参数会影响执行的行为 二、全字段排序 前面我们介绍过索引,所以你现在就很清楚了,为避免全表扫描,我们需要在 city 字段加上索引。 在 city 字段上创建索引之后,我们用 explain 命令来看看这个语句的执行情况。 图 1

mysql使用utf8mb4经验吐血总结

左心房为你撑大大i 提交于 2019-11-30 13:16:51
mysql使用utf8mb4经验吐血总结 1. utf8 与 utf8mb4 异同 先看 官方手册 https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html 的说明: The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. The utf8mb4 character set uses a maximum of four bytes per character supports supplementary characters: - For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length. - For a supplementary character, utf8 cannot store the character at all, whereas utf8mb4 requires four bytes to store it. Because utf8

mysql基础小结二

橙三吉。 提交于 2019-11-30 10:12:58
聚合函数 五种常用函数 COUNT : 计算表中的记录数(行数) SUM : 计算表中总值 AVG : 计算数据平均值 MAX : 求最大值 MIN :求最小值 COUNT函数的结果根据参数的不同而不同,COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数 聚合函数会将NULL排除在外。但COUNT(*)例外,并不会排除NULL。(四则运算中如果存在NULL,那么结果一定是NULL) 我们也可以使用聚合函数删除重复值(关键字DISTINCT) DISTINCT写在括号内,意思就是在计算行数之前删除重复数据,如果放在括号外的话,就没有意义了! 例: SELECT COUNT(DISTINCT <列名>) FROM <表名> ; 其他函数语法也相同! GROUP BY 子句就是将其分组的意思 语法格式:SELECT <列名> FROM <表名> GROUP BY <列名>; 多列使用逗号隔开! GROUP BY子句就是切分表的一把刀,根据你GROUP BY 后面的列名来分几个小块类型,GROUP BY 书写要求一定要写在FROM后面 (如果有WHERE子句的话需要写在WHERE子句之后)。 一般情况下书写顺序 SELECT -- FROM -- WHERE --GROUP BY SQL子句的顺序不能改变,也不能互相替换! 当聚合键

SQL优化案例一

十年热恋 提交于 2019-11-30 06:29:55
有一次开发同时问我,为什么下面这条语句运行这么慢,希望我能够给一下解决的办法。语句是这样的: select ftime , memberid, objkind, createtime, workprovince, workcity, home_area, home_cityname2, regip_area, regip_city, regip, ip_country, ip_area, ip_city, loginip, verifystatus, platform from f_zhenai_dish_ip_d where ftime >= '20190918' and ftime <= '20190919' group by ftime, memberid order by ftime desc limit 50 offset 0; 首先肯定是看一下执行计划 +----+-------------+--------------------+------------+-------+--------------------------------+-------------+---------+------+----------+----------+--------------------------------------------------------+ | id |

深入浅出Mysql索引的那些事儿

蓝咒 提交于 2019-11-30 03:48:09
文章来源:公众号:猿人谷 一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。 在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响不大。但是当数据量和访问量剧增的时候,就会发现mysql变慢,甚至down掉,这就必须要考虑优化sql了,给数据库建立正确合理的索引,是mysql优化的一个重要手段。 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从上往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。 在创建索引时,需要考虑哪些列会用于 SQL 查询,然后为这些列创建一个或多个索引。 事实上,索引也是一种表,保存着主键或索引字段,以及一个能将每个记录指向实际表的指针 。数据库用户是看不到索引的,它们只是用来加速查询的。数据库搜索引擎使用索引来快速定位记录。 INSERT 与 UPDATE

orderby是怎么工作的

*爱你&永不变心* 提交于 2019-11-30 02:07:27
extra中的using filesorting表示就是需要排序的,MySQL会给每一个线程分配一块内存用于排序,称为sort_buffer。 mysql分页查询优化 mysql源码学习 来源: CSDN 作者: qq_43641886 链接: https://blog.csdn.net/qq_43641886/article/details/103164523

MySQL按中文排序

≯℡__Kan透↙ 提交于 2019-11-29 18:02:28
今天在工作中遇到MySQL按照中文进行排序的问题,平时也有按照中文进行排序,但是没有具体研究过,这次进行一些总结,方便以后查阅。 在处理使用Mysql时,数据表采用utf8字符集,使用中发现中文不能直接按照拼音排序 如果数据表tbl的某字段name的字符编码是 latin1_swedish_ci select * from `tbl` order by birary(name) asc ; 如果数据表tbl的某字段name的字符编码是 utf8_general_ci SELECT name FROM `tbl` WHERE 1 ORDER BY CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC =================== $orderby="convert(`group` USING gbk) COLLATE gbk_chinese_ci,displayorder,navid" 最简单的排序方法只需要一条 SQL语句: select * from musician_ordered order by convert(name using gbk) collate gbk_chinese_ci; 首先,对name字段进行gbk编码,然后,对编码后的内容根据gbk_chinese_ci进行整理排序。 这样得到的结果

mysql 根据汉字首字母排序

一世执手 提交于 2019-11-29 18:01:57
在开发中,总会遇到各种变态问题,排序的时候要按照中文的首字母排序,这里就需要我们根据字符的编码集将汉字排序。 在mysql数据库中,存在很多种字符集保存方式,比如utf8、latin1等,所以对排序也要根据不同字符集处理。 1:如果数据库表字段的字符编码是latin1_swedish_ci select * from tablename order by birary(name) asc ; tablename:数据库表名 name:排序字段名 birary不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写 2:如果数据库表字段的字符编码是utf8_general_ci (常用) select * from tablename WHERE 1 = 1 order by CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC 首先,对name字段进行gbk编码,然后,对编码后的内容根据gbk_chinese_ci进行整理排序。这样得到的结果,英文是排在中文前面的,而且是根据拼音排序的。 tablename:数据库表名 name:排序字段名 CONVERT:提供一个在不同字符集之间转换数据的方法。 COLLATE:COLLATE是一个算法语句,主要用于对字符进行排序

mysql 中文字段排序 - 按拼音首字母排序

我怕爱的太早我们不能终老 提交于 2019-11-29 18:01:35
在处理使用Mysql时,数据表采用utf8字符集,直接oder by 对含有中文字符的数据排序,中文不是按照拼音排序的,可以用以下方法处理: 如果数据表 tbl 的某字段 name 的字符编码是 utf8_general_ci SELECT name FROM tbl WHERE 1 ORDER BY **CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC** 如果数据表tbl的某字段name的字符编码是 latin1_swedish_ci select * from `tbl` order by **birary(name) asc ; ** 参考: http://blog.csdn.net/zhichao2001/article/details/11721325 来源: CSDN 作者: 昵称诚诚 链接: https://blog.csdn.net/jobschen/article/details/47151535