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

标签 mysql sql optimization

拥有大量(可能是冗余的)WHERE 子句的非常非常大的 SQL 查询是否特别糟糕?

例如,这是我从我的 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

它似乎运行良好,但流量也不是特别高(每天大约有几百次点击),我想知道是否值得努力优化查询以消除冗余等。

最佳答案

阅读您的查询让我想玩角色扮演游戏。

这绝对不会太长。只要它们格式正确,我认为实际限制是大约 100 行。在那之后,您最好将子查询分解为 View ,以免视线交叉。

我处理过一些超过 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.
*/

关于mysql - SQL 查询长度的实际限制(特别是 MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/96553/

相关文章:

MySQL SUM() 基于多个条件

php - mysql_real_escape_string、stripslashes 和 htmlspecialchars

sql - 带单引号的 ADF 数据流连接表达式

python - 如何在 Python 中向 MySQL 表插入一行?

MySQL锁困惑

java - 使用 JDBC 将值插入 SQL 数据库

php - 从 json 数组获取值并执行 sql 插入

php - call_user_func_array 的替代方案

optimization - Sonar 报告中的认知复杂性是什么?

python - 如何在pytorch中打印Adadelta中的 "actual"学习率