首页 > 试题广场 >

SQL性能优化 Customer表定义如下 CREATE T

[问答题]
SQL性能优化
Customer表定义如下
CREATE TABLE `test01` (
    custid` int(10) NOT NULL,
    custname` varchar(100) NOT NULL,
    date` datetime default NULL,
    money` int(10) default NULL,
    PRIMARY KEY  (`custid`),
    KEY `index_test01_custname` (`custname`),
    KEY `index_test01_custname_union` (`money`,` date`,`custname`,),
)
secondinfo 表定义如下
CREATE TABLE `test02` (
  secid` int(10) NOT NULL,
  firstid` int(10) NOT NULL,
  custid` int(10) default NULL,
  PRIMARY KEY (`secid`),
  KEY `Index_test02_custid` (`custid `)
)

下列SQL执行速度比较慢,请分析原因并做优化:
1)    SELECT  *  FROM  test01  WHERE  substring(custname,1,4)='beizhi';
2)    SELECT  *  FROM  test01  WHERE  money/30<1000; 
3)    SELECT  *  FROM  test01  WHERE  custname=3721; 
4)    SELECT * FROM test02 s WHERE s.custid NOT IN (SELECT c.custid FROM test01 c);
5)    select * from test01 where money<1000
union
select * from test01 where date >’20150101’;
1. SELECT  *  FROM  test01  WHERE  substring(custname,1,4)='beizhi'; //where后使用函数会导致索引失效
 改为: SELECT  *  FROM  test01  WHERE  custname like ‘beizhi%';
2. SELECT  *  FROM  test01  WHERE  money/30<1000; //应把左边运算放到右边
改为:SELECT  *  FROM  test01  WHERE  money<1000*30; 
3.SELECT  *  FROM  test01  WHERE  custname=3721; //语法错误
改为:SELECT  *  FROM  test01  WHERE  custname=’3721‘;
4. SELECT * FROM test02 s WHERE s.custid NOT IN (SELECT c.custid FROM test01 c);//not in  使用也会导致索引失效
改为:select * fron test02 a left join test01 b on a.custid=b.custid where b.custid=null
5.应改为:select * from test01 where money<1000 and  date >’20150101’
发表于 2019-06-13 00:19:13 回复(0)
union 和 union all 结果可能不一样啊,union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。

发表于 2022-07-16 17:29:58 回复(0)
先用程序把数据处理好再来更新数据库不好吗
发表于 2020-02-27 16:31:19 回复(0)