Rok*_*alj 3 mysql sql alias caching view
基本上,我有这样的多个查询:
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
Run Code Online (Sandbox Code Playgroud)
问题是,我经常使用这个LONG QUERY.我希望给这个子查询一个别名,主要是:
直到现在,我一直这样做存储:
variable = LONG QUERY;
Query("SELECT a, b, c FROM ("+variable+") X WHERE ...");
Run Code Online (Sandbox Code Playgroud)
哪个不错.我正在寻找一种方法在内部使用mysql.
是否有可能创建一个简单的只读视图,这将产生无开销,所以我可以在任何地方做?我相信这是更有道理和可读的方式.
SELECT a, b, c FROM myTable WHERE ...
Run Code Online (Sandbox Code Playgroud)
通常这些被称为视图.例如:
CREATE VIEW vMyLongQuery
AS
SELECT a, b, c FROM (LONG QUERY) X WHERE ...
Run Code Online (Sandbox Code Playgroud)
然后可以像这样引用:
SELECT a, b, c FROM vMyLongQuery
Run Code Online (Sandbox Code Playgroud)
有关语法的详细信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/create-view.html.
就性能而言,最佳案例性能将与您现在正在做的完全相同,最坏的情况是它会扼杀您的应用程序.这取决于你对视图的处理方式以及MySQL如何处理它们.
MySQL的实施意见两种方式merge
和temptable
.该merge
选项几乎就是您现在正在执行的操作,您的视图将作为子查询合并到您的查询中.使用temptable它实际上会将所有数据假脱机到temptable然后select/join
到那个temptable.当数据连接到temptable时,您也会失去索引优势.
作为抬头,merge
查询计划不支持您视图中的以下任何内容.
因此,如果您的子查询使用这些,则可能会损害性能.
另外,仔细注意OMG小马的建议,观点与基类不同.视图在数据库中占有一席之地但很容易被滥用.当工程师从OO背景进入数据库时,视图似乎是一种促进代码继承和可重用性的便捷方式.通常人们最终会发现自己处于嵌套视图的位置,这些视图连接到嵌套视图的嵌套视图.SQL通过基本上获取每个单独视图的定义并将其扩展为将使DBA哭泣的查询的野兽来处理嵌套视图.
此外,您在示例中遵循了优秀的做法,我鼓励您继续这样做.您单独指定了所有列,从未使用SELECT*指定视图的结果.它最终会破坏你的一天.
归档时间: |
|
查看次数: |
1135 次 |
最近记录: |