优化一个mysql语句

优化了一个mysql的语句,没有什么技术含量,说一下过程:

优化前语句如下,大约执行时间为1-2秒

select  u.id ,u.s_user_name,u.s_user_img,(select count(a.n_copy_count) from t_fonts a 
join t_practicerecords b on b.n_font_id=a.id where a.n_user_id=u.id and b.n_delete=0 group by a.n_user_id)as n_copy_count,case when (select count(id) from t_friendships  
where n_user_id=11311 and n_friend_id=u.id)>0 then ‘true‘ else ‘false‘ end as is_collected  from t_users u  
where BINARY `s_user_name` = ‘做字小助手‘  order by LENGTH(s_user_name) asc ,id asc limit 0,10

相关的执行计划如下:

mysql> EXPLAIN select  u.id ,u.s_user_name,u.s_user_img,(select count(a.n_copy_count) from t_fonts a  join t_practicerecords b on b.n_font_id=a.id where a.n_user_id=u.id and b.n_delete=0 group by a.n_user_id)as n_copy_count,case when (select count(id) from t_friendships   where n_user_id=11311 and n_friend_id=u.id)>0 then ‘true‘ else ‘false‘ end as is_collected  from t_users u   where BINARY `s_user_name` = ‘做字小助手‘  order by LENGTH(s_user_name) asc ,id asc limit 0,10;
+----+--------------------+---------------+------------+--------+-------------------------------------------------------------+---------------------------------+---------+------------------+---------+----------+-----------------------------+
| id | select_type        | table         | partitions | type   | possible_keys                                               | key                             | key_len | ref              | rows    | filtered | Extra                       |
+----+--------------------+---------------+------------+--------+-------------------------------------------------------------+---------------------------------+---------+------------------+---------+----------+-----------------------------+
|  1 | PRIMARY            | u             | NULL       | ALL    | NULL                                                        | NULL                            | NULL    | NULL             | 1360606 |   100.00 | Using where; Using filesort |
|  3 | DEPENDENT SUBQUERY | t_friendships | NULL       | eq_ref | PRIMARY,PK__T_friend__3213E83F571DF1D5,user_index,n_user_id | PRIMARY                         | 8       | const,sykdb.u.id |       1 |   100.00 | NULL                        |
|  2 | DEPENDENT SUBQUERY | a             | NULL       | ref    | PRIMARY,n_user_index                                        | n_user_index                    | 4       | sykdb.u.id       |       7 |   100.00 | Using index condition       |
|  2 | DEPENDENT SUBQUERY | b             | NULL       | ref    | idx_fid_score_delete_uploadtime                             | idx_fid_score_delete_uploadtime | 5       | sykdb.a.id,const |       5 |   100.00 | Using index                 |
+----+--------------------+---------------+------------+--------+-------------------------------------------------------------+---------------------------------+---------+------------------+---------+----------+-----------------------------+
4 rows in set, 4 warnings (0.00 sec)

对t_users表的s_user_name字段创建索引,并修改表结构

mysql> create index idx_user_name on t_users (s_user_name);
Query OK, 0 rows affected (5.55 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table t_users modify s_user_name varchar(100) binary;
Query OK, 1474778 rows affected (45.23 sec)
Records: 1474778  Duplicates: 0  Warnings: 0

修改语句把binary去掉,再次查询如下:

mysql> select  u.id ,u.s_user_name,u.s_user_img,(select count(a.n_copy_count) from t_fonts a  join t_practicerecords b on b.n_font_id=a.id where a.n_user_id=u.id and b.n_delete=0 group by a.n_user_id)as n_copy_count,case when (select count(id) from t_friendships   where n_user_id=11311 and n_friend_id=u.id)>0 then ‘true‘ else ‘false‘ end as is_collected  from t_users u   where `s_user_name` = ‘做字小助手‘  order by LENGTH(s_user_name) asc ,id asc limit 0,10;
+----+-----------------+--------------------------------+--------------+--------------+
| id | s_user_name     | s_user_img                     | n_copy_count | is_collected |
+----+-----------------+--------------------------------+--------------+--------------+
|  2 | 做字小助手 | /0/1/photo/20160729035328.jpeg |         NULL | false        |
+----+-----------------+--------------------------------+--------------+--------------+
1 row in set (0.00 sec)

不过修改表结构需谨慎。

时间: 2024-12-27 15:33:09

优化一个mysql语句的相关文章

【夯实Mysql基础】记一次mysql语句的优化过程!

1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使用了 2个 order by和 1个limit的分页 sql. 一个sql是上一个sql的count(*),即链接了5个表,当然没有limit了(取总数). 2. [着手优化] 1)[优化思路] 第一条是 做client调用 service层的数据缓存 第二条就是 优化sql本身. 这里着重讲一下

mysql语句优化总结(一)

Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A.     inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM

MySql 用户管理 中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 如果报错解决方法:https://i.c

网站优化之mysql优化

一,网站优化之mysql优化:1.前缀索引,可以通过前缀去识别唯一性,把这个前缀作为索引内容,可以节省存储索引的空间,从而提高索引的查询速度.distinct 排重操作2,2.in条件索引使用同时查询出id为1,3,6select * from where id =1:select * from where id =3:select * from where id =6:select * from where id in(1,3,6): //in条件可以使用到索引3,全文索引文本字段才能够建立全

MySQL语句explain详解

我们一般再检查一个SQL语句执行效率的时候,通常会首先用explain来看下该语句的相关情况.虽然经常使用,但时候你深刻的理解了其结果中每个字段的含义呢?其中type字段是我们关注的重中之重.type字段的归纳:     连接类型     system          表只有一行     const           表最多只有一行匹配,通用用于主键或者唯一索引比较时     eq_ref          每次与之前的表合并行都只在该表读取一行,这是除了system,const之外最好的一

应该掌握的MySQL命令、MySQL语句

一.MySQL常用的命令: 1. 连接数据库:mysql>mysql -uroot -p回车,再输入密码   mysql -h 192.168.0.200 -P 3306 -u root -p2. mysql>status; 查看运行环境信息3. 显示所有数据库 : show databases;4. 切换连接数据库的语法 : use mydatabase;5. 显示数据库中的所有表 : show tables;6. 显示某个表创建时的全部信息 : show create table tabl

Mysql 语句执行顺序

转载自:http://blog.csdn.net/jintao_ma/article/details/51253356 1.这样一个问题,作为一个开发人员需要掌握数据库的哪些东西?  在开发中涉及到数据库,基本上只用到了sql语句,如何写sql以及对其进行优化就比较重要,那些mysql的厚本书籍针对的是DBA,我们只需要学习其中的sql就可以了. 2.既然会写sql是目标,那么怎么才能写好sql.学习下面几点: 1)Mysql的执行顺序,这个是写sql的核心,之前遇到的一些错误就是因为对其不了解

腾讯云数据库团队:MySQL语句复制(SBR)的缺陷列举

作者介绍: 赵伟 腾讯云TDSQL数据库开发者 MySQL (这里的MySQL是指广义的mysql,包括oracle,mysql,percona,mariadb等)的Statement Based Replication (SBR)是一个暗坑无数的功能,可能导致主备机数据不一致,以及其它问题,所以在TDSQL中我们使用RBR.这里就列举几条SBR的坑. 在此之前,先说说SBR的有点.与Row based Replication (RBR)相比,它可以避免传输大量的binlog日志从而减小网络和存

常用的MySql语句

/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld --skip-grant-tables-- 修改root密码密码加密函数password()update mysql.user set password=password('root'); SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- /* 数据库操