当前位置:  开发笔记 > 编程语言 > 正文

SQL查询长度的实际限制(特别是MySQL)

如何解决《SQL查询长度的实际限制(特别是MySQL)》经验,为你挑选了2个好方法。

拥有一个非常非常大的SQL查询以及许多(可能是多余的)WHERE子句是否特别糟糕?

例如,这是我从我的Web应用程序生成的一个查询,其中所有内容都已关闭,这应该是此程序生成的最大可能查询:

SELECT * 
FROM 4e_magic_items 
INNER JOIN 4e_magic_item_levels 
  ON 4e_magic_items.id = 4e_magic_item_levels.itemid 
INNER JOIN 4e_monster_sources 
  ON 4e_magic_items.source = 4e_monster_sources.id 
WHERE (itemlevel BETWEEN 1 AND 30)  
  AND source!=16 AND source!=2 AND source!=5 
  AND source!=13 AND source!=15 AND source!=3 
  AND source!=4 AND source!=12 AND source!=7 
  AND source!=14 AND source!=11 AND source!=10 
  AND source!=8 AND source!=1 AND source!=6 
  AND source!=9  AND type!='Arms' AND type!='Feet' 
  AND type!='Hands' AND type!='Head' 
  AND type!='Neck' AND type!='Orb' 
  AND type!='Potion' AND type!='Ring' 
  AND type!='Rod' AND type!='Staff' 
  AND type!='Symbol' AND type!='Waist' 
  AND type!='Wand' AND type!='Wondrous Item' 
  AND type!='Alchemical Item' AND type!='Elixir' 
  AND type!='Reagent' AND type!='Whetstone' 
  AND type!='Other Consumable' AND type!='Companion' 
  AND type!='Mount' AND (type!='Armor' OR (false )) 
  AND (type!='Weapon' OR (false )) 
 ORDER BY type ASC, itemlevel ASC, name ASC

它似乎工作得很好,但它也没有特别高的流量(每天几百次点击),我想知道是否值得努力尝试优化查询以消除冗余等.



1> JosephStyons..:

阅读你的查询让我想玩RPG.

这绝对不会太久.只要它们格式良好,我就说实际限制大约是100行.在那之后,你最好将子查询分成视图,以防止眼睛交叉.

我已经处理了一些1000多行的查询,这很难调试.

顺便问一下,我可以建议重新格式化的版本吗?这主要是为了证明格式化的重要性; 我相信这会更容易理解.

select *  
from
  4e_magic_items mi
 ,4e_magic_item_levels mil
 ,4e_monster_sources ms
where mi.id = mil.itemid
  and mi.source = ms.id
  and itemlevel between 1 and 30
  and source not in(16,2,5,13,15,3,4,12,7,14,11,10,8,1,6,9)  
  and type not in(
                  'Arms' ,'Feet' ,'Hands' ,'Head' ,'Neck' ,'Orb' ,
                  'Potion' ,'Ring' ,'Rod' ,'Staff' ,'Symbol' ,'Waist' ,
                  'Wand' ,'Wondrous Item' ,'Alchemical Item' ,'Elixir' ,
                  'Reagent' ,'Whetstone' ,'Other Consumable' ,'Companion' ,
                  'Mount'
                 )
  and ((type != 'Armor') or (false))
  and ((type != 'Weapon') or (false))
order by
  type asc
 ,itemlevel asc
 ,name asc

/*
Some thoughts:
==============
0 - Formatting really matters, in SQL even more than most languages.
1 - consider selecting only the columns you need, not "*"
2 - use of table aliases makes it short & clear ("MI", "MIL" in my example)
3 - joins in the WHERE clause will un-clutter your FROM clause
4 - use NOT IN for long lists
5 - logically, the last two lines can be added to the "type not in" section.
    I'm not sure why you have the "or false", but I'll assume some good reason
    and leave them here.
*/


downvote用于使用JOIN条件来混乱WHERE子句.
FROM子句中的连接将整理WHERE子句.@Aeon - 与正确的查询优化器应该没有性能差异.是mysql那么糟糕吗?

2> Chris..:

默认MySQL 5.0服务器限制为" 1MB ",可配置高达1GB.

这是通过客户端和服务器上的max_allowed_pa​​cket设置配置的,有效限制是两者中的出租人.

注意事项:

这种"数据包"限制可能不会直接映射到SQL语句中的字符.当然,您想要考虑客户端中的字符编码,一些数据包元数据等.)

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有