基本上,我有这样的多个查询:
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
问题是,我经常使用这个LONG QUERY.我希望给这个子查询一个别名,主要是:
>缩短&简化查询(还减少错误和代码重复)
>可能优化性能. (我相信这是默认通过mysql查询缓存完成的)
直到现在,我一直这样做存储:
variable = LONG QUERY;
Query("SELECT a, b, c FROM ("+variable+") X WHERE ...");
哪个不错.我正在寻找一种方法在内部使用mysql.
是否有可能创建一个简单的只读视图,这将产生无开销,所以我可以在任何地方做?我相信这是更多的适当者和这样做的可读方式.
SELECT a, b, c FROM myTable WHERE ...
解决方法:
通常这些被称为视图.例如:
CREATE VIEW vMyLongQuery
AS
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
然后可以像这样引用:
SELECT a, b, c FROM vMyLongQuery
就性能而言,最佳案例性能将与您现在正在做的完全相同,最坏的情况是它会扼杀您的应用程序.这取决于你对视图的处理方式以及MySQL如何处理它们.
MySQL实现了两种方式合并和temptable的视图.合并选项几乎就是您现在正在执行的操作,您的视图将作为子查询合并到您的查询中.使用temptable它实际上将所有数据假脱机到temptable然后选择/ join到那个temptable.当数据连接到temptable时,您也会失去索引优势.
作为抬头,合并查询计划不支持视图中的以下任何内容.
>聚合函数(SUM(),MIN(),MAX(),COUNT()等)
> DISTINCT
> GROUP BY
> HAVING
>限制
> UNION或UNION ALL
>选择列表中的子查询
>引用没有基础表的文字
因此,如果您的子查询使用这些,则可能会损害性能.
另外,仔细注意OMG小马的建议,观点与基类不同.视图在数据库中占有一席之地但很容易被滥用.当工程师从OO背景进入数据库时,视图似乎是一种促进代码继承和可重用性的便捷方式.通常人们最终会发现自己处于嵌套视图的位置,这些视图连接到嵌套视图的嵌套视图. SQL通过基本上获取每个单独视图的定义并将其扩展为将使DBA哭泣的查询的野兽来处理嵌套视图.
此外,您在示例中遵循了优秀的做法,我鼓励您继续这样做.您单独指定了所有列,从未使用SELECT *指定视图的结果.它最终会破坏你的一天.
标签:sql,caching,mysql,alias,view
来源: https://codeday.me/bug/20190902/1793372.html