MYsql IN谓词优化

来源:互联网 发布:软件下载网线 编辑:程序博客网 时间:2024/05/16 07:07

最近在完成小任务时,遇到多表联查的问题,更改某个数据表中符合过滤条件的商品的分类字段:cat_paths

数据表结构简化如下

数据表1,product:

product_id   product_name      cat_paths

123                 '补差价'                 '58.70'


数据表2,price:

product_id       sale_price

123                   100


需求将满足sale_price为100元的商品的的cat_paths改为“58.70”。

刚开始使用的sql语言是:

update product set cat_paths = "58.70" where product_id in (select product_id from price where sale_price = 100)

由于数据量较大,上面sql执行时间较长。

经过查阅资料优化为如下sql:

update product,(select product_id from price where sale_price = 100) set cat_paths = "58.70" 

经过优化后执行时间缩短一半。


经过这个小项目,自己几乎是从0开始使用mysql,使用过程中的总结如下:

1、中文乱码问题:

   解决办法:set names gbk;

2、OUTER JOIN外连接问题:

   right join;inner join;right join的不同,会出现数据重复的问题。注意添加where过滤条件。

3、子查询中的IN Mysql会将IN转化为exists,会使时间执行较长。

   解决办法:针对大数据量,尽量不要使用IN,将子查询改写成派生表的来提高效率,如上例就使用了此方法。

4、查看sql语言的执行计划:

   使用explain sql;命令,如果想得到更具体的执行计划使用explain extended sql;

5、like 模糊匹配的使用。

   like '%key%';

6、in 和 exists的区别:

   in 和 exists是一样的,具有相同的执行计划。但是not in 和 not exists具有很大的区别,exists对于三值逻辑的判断,        exists总是返回true和false, 但是对于IN来说,除了TRUE和FLSE值外,还有可能对NULL值返回UNKNOWN.

输入列表中包含NULL值时,NOT EXISTS和NOT IN 之间的差异很明显,在输入列表中包含NULL值时,IN总是返回TRUE和UNKNOWN,因此not in 总是返回NOT TURE HE  NOT UNKNOWN,即false和unknown.

select 'c' not in ('a','b',NULL) 返回的是null而不是true。





0 0
原创粉丝点击