php+sql优化方案,SQL优化方案

SQL编写技巧

• 合理使用索引

索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;

一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况

• 使用UNION ALL替代UNION

UNION ALL的执行效率比UNION高,UNION执行时需要排重;UNION需要对数据进行排序

• 避免select * 写法

执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。

• JOIN字段建议建立索引

一般JOIN字段都提前加上索引

• 避免复杂SQL语句

提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理

• 避免where 1=1写法

• 避免order by rand()类似写法

优化案例

• 表结构

CREATE TABLE `a`

(

`id` int(11) NOT NULLAUTO_INCREMENT,

`seller_id` bigint(20) DEFAULT NULL,

`seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,

`gmt_create` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)

);

CREATE TABLE `b`

(

`id` int(11) NOT NULLAUTO_INCREMENT,

`seller_name` varchar(100) DEFAULT NULL,

`user_id` varchar(50) DEFAULT NULL,

`user_name` varchar(100) DEFAULT NULL,

`sales` bigint(20) DEFAULT NULL,

`gmt_create` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)

);

CREATE TABLE `c`

(

`id` int(11) NOT NULLAUTO_INCREMENT,

`user_id` varchar(50) DEFAULT NULL,

`order_id` varchar(100) DEFAULT NULL,

`state` bigint(20) DEFAULT NULL,

`gmt_create` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)

);

• 关联语句

select a.seller_id,

a.seller_name,

b.user_name,

c.state

from a,

b,

c

where a.seller_name = b.seller_name

and b.user_id = c.user_id

and c.user_id = 17

and a.gmt_create

BETWEEN DATE_ADD(NOW(), INTERVAL – 600 MINUTE)

AND DATE_ADD(NOW(), INTERVAL 600 MINUTE)

order by a.gmt_create;

• 初步优化方案

alter table b modify `user_id` int(10) DEFAULT NULL;

alter table c modify `user_id` int(10) DEFAULT NULL;

alter table c add index `idx_user_id`(`user_id`);

alter table b add index `idx_user_id_sell_name`(`user_id`,`seller_name`);

alter table a add index `idx_sellname_gmt_sellid`(`gmt_create`,`seller_name`,`seller_id`);

原文链接:https://blog.csdn.net/jianzhang11/article/details/102867120

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值