MySQL SQL优化一

建表语句:

tb_item与tb_item01、tb_item02、tb_item03表结构一致

create table `tb_item` (
	`id` double ,
	`title` varchar (300),
	`sell_point` varchar (1500),
	`price` double ,
	`num` double ,
	`barcode` varchar (90),
	`image` varchar (1500),
	`cid` double ,
	`status` tinyint (4),
	`created` datetime ,
	`updated` datetime 
); 
insert into `tb_item` (`id`, `title`, `sell_point`, `price`, `num`, `barcode`, `image`, `cid`, `status`, `created`, `updated`) values('536563','阿尔卡特','29900000','99999','','','560','1','2015-03-08 21:33:18','2015-04-11 20:38:38');
insert into `tb_item` (`id`, `title`, `sell_point`, `price`, `num`, `barcode`, `image`, `cid`, `status`, `created`, `updated`) values('562379','三星','下单','1100','99999','','','560','1','2015-03-08 21:27:54','2015-04-12 17:10:43');

索引单表优化: 

EXPLAIN 
SELECT * FROM tb_item WHERE title = '中兴 U288 珠光白 移动3G手机' AND price>0 ORDER BY created DESC LIMIT 1;

优化

CREATE INDEX idx_title_p_created ON tb_item(title,price,created);

发现还有:Using filesort

DROP INDEX idx_title_p_created ON tb_item;

 分析:

由于出现type = range,这是可以忍受的。但是extra里使用Using filesort是无法接受的。

我们建立的索引失效的原因是由于先排序title,再排序price,在排序created。但是price>0是一个范围,MySQL无法使用索引对后面的created进行检索。

结论:range类型查询字段后面的索引无效。

继续优化

CREATE INDEX idx_title_created ON tb_item(title,created);

结果:优化成功。

 

索引两表优化:

EXPLAIN
SELECT * FROM tb_item_01 t1 LEFT JOIN tb_item_02 t2 ON t1.title = t2.title;

优化:给右表加索引

CREATE INDEX idx_title ON tb_item_02(title);

 给左表加索引

DROP INDEX idx_title ON tb_item_02;
CREATE INDEX idx_title ON tb_item_01(title);

总结:左连接加右表。右连接加左表。

 

索引优化三表查询:

EXPLAIN
SELECT * FROM tb_item_01 t1 
LEFT JOIN tb_item_02 t2 ON t1.title = t2.title
LEFT JOIN tb_item_03 t3 ON t1.title = t3.title;

 

优化

CREATE INDEX idx_title_02 ON tb_item_02(title);
CREATE INDEX idx_title_03 ON tb_item_03(title);

 

总结:

join的优化:尽可能减少join语句中的NestedLoop的循环总次数:“永远用小的结果集,驱动大的结果集”。

优先优化NestedLoop的内层循环。

保证join语句中被驱动表上join条件字段已经被索引。

当无法保证驱动表的join条件字段被索引且内存资源充足的前提下,不要太吝啬Joinbuffer的设置。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL SQL优化是指对MySQL数据库中的SQL语句进行调优,以高查询性能和优化数据库操作的效。下面是一些见的MySQL SQL优化技巧: 1. 合理选择索引:使用适当的索引可以大大提查询性能。需要根据具体的查询条件表结构来选择合适索引。 2. 避免全表扫描:尽量避免使用不带有索引的列进行查询,这样会导致全表扫描,效率较低。可以通过添加索引或者优化查询条件来避免全表扫描。 3. 避免SELECT *:在查询时,尽量避免使用SELECT *,而是明确列出需要查询的字段。这样可以减少网络传输和内存消耗。 4. 优化查询语句:合理编写查询语句,避免使用不必要的子查询和多表连接等复杂操作。可以通过使用EXPLAIN语句来分析查询语句的执行计划,找出执行效率较低的地方。 5. 适当分页:对于大数据量的查询,可以使用LIMIT语句进行分页查询,避免一次性返回大量数据。 6. 避免频繁的连接和断开:在应用程序中,尽量使用连接池来管理数据库连接,避免频繁的连接和断开操作。 7. 优化表结构:合理设计表结构,避免字段冗余和表关联过多。可以通过分表、分区等方式来优化表结构。 8. 避免大事务操作:大事务操作会占用较多的系统资源,影响数据库的并发性能。尽量将大事务拆分成多个小事务。 9. 定期维护数据库:定期进行数据库的备份、优化和统计分析,清理无用数据和索引等,保持数据库的健康状态。 以上是一些常见的MySQL SQL优化技巧,具体的优化方法需要根据实际情况进行分析和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值