MySQL性能优化(六)

一、order by产生using filesort详解

  1.首先建表和索引

/*课程表*/
create table course(
    id int primary key auto_increment,/* 主键自增*/
    title varchar(50) not null,/* 标题*/
    category_id int not null,/* 属于哪个类目*/
    school_id int not null,/* 属于哪个学校*/
    buy_times int not null,/* 购买次数*/
    browse_times int not null/* 浏览次数*/
);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘java课程‘,1,1,800,8680);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘android课程‘,2,1,400,8030);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘mysql课程‘,3,2,200,2902);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘oracle课程‘,2,2,100,6710);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘C#课程‘,1,3,620,2890);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘PS课程‘,4,4,210,4300);
insert into course(title,category_id,school_id,buy_times,browse_times) values(‘CAD课程‘,5,1,403,6080);

/*在category_id和buy_times上建立组合索引*/
create index idx_cate_buy on course(category_id,buy_times);

  2.order by 会产生 using filesort的有哪些?

  (1)explain select id from course where category_id>1 order by category_id;

    根据最左前缀原则,order by后面的的category_id会用到组合索引

  (2)explain select id from course where category_id>1 order by category_id,buy_times;

    根据最左前缀原则,order by后面的的category_id buy_times会用到组合索引,因为索引就是这两个字段

  (3)explain select id from course where category_id>1 order by buy_times;

    根据最左前缀原则,order by后面的字段是缺少了最左边的category_id,所以会产生 using filesort

  (4)explain select id from course where category_id>1 order by buy_times,category_id;

    order by后面的字段顺序不符合组合索引中的顺序,所以order by后面的不会走索引,即会产生using filesort

  (5)explain select id from course order by category_id;

    根据最左前缀原则,order by后面存在索引中的最左列,所以会用到索引

  (6)explain select id from course order by buy_times;

    根据最左前缀原则,order by后面的字段 没有索引中的最左列的字段,所以不会走索引,会产生using filesort

  (7)explain select id from course where buy_times > 1 order by buy_times;

    根据最左前缀原则,order by后面的字段 没有索引中的最左列的字段,所以不会走索引,会产生using fillesort

  (8)explain select id from course where buy_times > 1 order by category_id;

    根据最左前缀原则,order by后面的字段存在于索引中最左列,所以会走索引

  (9)explain select id from course order by buy_times desc,category_id asc;

    根据最最左前缀原则,order by后面的字段顺序和索引中的不符合,则会产生using filesort

  (10)explain select id from course order by category_id desc,buy_times asc;

    这一条虽然order by后面的字段和索引中字段顺序相同,但是一个是降序,一个是升序,所以也会产生using filesort,同时升序和同时降序就不会产生using filesort了

二、in和exists哪个性能更优

  sql脚本:

/*建库*/
create database testdb6;
use testdb6;
/* 用户表 */
drop table if exists users;
create table users(
id int primary key auto_increment,
name varchar(20)
);
insert into users(name) values (‘A‘);
insert into users(name) values (‘B‘);
insert into users(name) values (‘C‘);
insert into users(name) values (‘D‘);
insert into users(name) values (‘E‘);
insert into users(name) values (‘F‘);
insert into users(name) values (‘G‘);
insert into users(name) values (‘H‘);
insert into users(name) values (‘I‘);
insert into users(name) values (‘J‘);

/* 订单表 */
drop table if exists orders;
create table orders(
id int primary key auto_increment,/*订单id*/
order_no varchar(20) not null,/*订单编号*/
title varchar(20) not null,/*订单标题*/
goods_num int not null,/*订单数量*/
money decimal(7,4) not null,/*订单金额*/
user_id int not null    /*订单所属用户id*/
)engine=myisam default charset=utf8 ;

delimiter $$
drop procedure batch_orders $$

/* 存储过程 */
create procedure batch_orders(in max int)
begin
declare start int default 0;
declare i int default 0;
set autocommit = 0;
 while i < max do
   set i = i + 1;
   insert into orders(order_no,title,goods_num,money,user_id)
   values (concat(‘NCS-‘,floor(1 + rand()*1000000000000 )),concat(‘订单title-‘,i),i%50,(100.0000+(i%50)),i%10);
 end while;
commit;
end $$
delimiter ;

/*插入1000万条订单数据*/
call batch_orders(10000000);     /*插入数据的过程根据机器的性能 花费的时间不同,有的可能3分钟,有的可能10分钟*/

  上面的sql中 订单表中(orders) 存在user_id,而又有用户表(users),所以我们用orders表中user_id和user表中的id 来in 和 exists。

  结果分析

  1.where后面是小表

  (1)select count(1) from orders o where o.user_id in(select u.id from users u);

  

  (2)select count(1) from orders o where exists (select 1 from users u where u.id = o.user_id);

  

  

三、慢查询

四、锁机制

时间: 2024-10-11 10:32:04

MySQL性能优化(六)的相关文章

Java面试准备十六:数据库——MySQL性能优化

这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢. 来自MySQL性能优化的最佳20+经验 为查询缓存优化你的查询 EXPLAIN你的SELECT查询 当只要一行数据是使用LIMIT 1 为搜索字段建索引 在Join表的时候使用相当类型的列,并将其索引 千万不要ORDER BY RAND() 避免SELECT * 永远为每张表设置一个ID 使用ENUM而不是VARCHAR 从PROCEDURE ANALYSE() 取得建议 尽可能的使用NOT NULL

mysql 性能优化方案 (转)

网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用 status信息对mysql进行具体的优化. mysql> show global status; 可以列出mysql服务器运行各种状态值,另外,查询mysql服务器配置信息语句: mysql> show variables; 一

mysql性能优化总结1

MySQL性能优化总结 一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI).每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存

Mysql5.7—mysql性能优化-索引、语句、配置(运维必备)

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. 数据库的类型 1) 第一代数据库: 基于层次模型与网状模型的数据库 层次型数据库比较经典的是IBM公司的IMS(InformationManagement System)数据库,层次型数据库提供了良好的完整性支持,模型简单,对具有一对多层关系的部们描述非常自然.直观,容易理解,比较适用于那些实体间联系是固定的且预先定义好的环境,其性能优于关

MySQL性能优化(二)

1.MySQL基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样) insert into t3 select * from t1; --t1的数据全部拿过来,注意是表结构一致才select* ,否则选择相应的的字段列插入 create table t1( id int unsigned not null auto_increment primary key,

Mysql性能优化之缓存参数优化

数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO.本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来进行IO优化: 一.query_cache_size/query_cache_type (global)    Query cache 作用于整个 MySQL Inst

MySQL 性能优化,优化设计及设计原则解读

MySQL性能优化的目的 如何合理的设计数据库? 什么样的数据库设计才能给后期DBA优化提供基石? 数据库设计与程序设计的差异? 数据库设计早期优化 关系明确(理清表之间的关系,可以通过冗余的方式提高效率) 节省空间(根据业务经验,设置字段长短) 提高效率 数据库表开发流程 原型=>逐步完善(表的设计也是如此) 数据库种类 层级数据库(注册表) 如:Windows操作系统的核心就是一个注册表,由于配置项比较多,采用层级关系的数据存储 关系型数据库 如:MySQL 时序数据库 图数据库 如:最短路

mysql 性能优化方案

这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用status信息对mysql进行具体的优化. mysql> show global status; 可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:mysql> sho

MySQL配置文件mysql.ini参数详解、MySQL性能优化

MySQL配置文件mysql.ini参数详解.MySQL性能优化 my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.   Client Section用来配置MySQL客户端参数.   要查看配置参数可以用下面的命令: show variables like '%innodb%'; # 查看innodb相关配置参数 show status like

MySQL 性能优化的最佳20多条经验分享

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的                    事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语                句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的M