{"id":10394,"date":"2026-09-12T12:30:00","date_gmt":"2026-09-12T10:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10394"},"modified":"2026-09-09T17:07:25","modified_gmt":"2026-09-09T15:07:25","slug":"meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/","title":{"rendered":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet"},"content":{"rendered":"<p>Eine Seite, die Beitr\u00e4ge nach drei eigenen Feldern filtert, ist in PHP ein Feld und in SQL vier Verbindungen. Das Feld liest sich wie ein Filter; das SQL liest sich wie eine Tabelle, die f\u00fcr jede Bedingung erneut besucht wird &#8211; denn genau das ist es.<\/p>\n<p>Das Bemerkenswerte ist nicht, dass es langsam ist; die meisten Seiten werden nie gro\u00df genug, dass es auffiele. Bemerkenswert ist, dass die Kosten in dem Code unsichtbar sind, der sie verursacht, und dass sie mit zwei Dingen zugleich wachsen: mit der Zahl der Klauseln und mit der Gr\u00f6\u00dfe einer Tabelle, die sich niemand ansieht.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/verbindungstreppe-de.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Eine Treppe aus Abfragestufen: die Grundabfrage liest 4800 Zeilen, jede der drei meta_query-Verbindungen kommt mit 192000 Zeilen hinzu, derselbe Filter als Taxonomie liest 5120\"><figcaption>Dieselbe Ergebnismenge, vier Wege dorthin. Der Balken der Grundabfrage fehlt nicht, er ist drei Pixel breit.<\/figcaption><\/figure>\n<h2>Was WP_Query aus dem Feld baut<\/h2>\n<p>Jede Klausel in <code>meta_query<\/code> bekommt einen eigenen Aliasnamen auf <code>wp_postmeta<\/code> und eine eigene Verbindungsbedingung. Zwei Klauseln, zwei Aliasnamen; f\u00fcnf Klauseln, f\u00fcnf. Die Tabelle wird so oft mit sich selbst verbunden, wie es Bedingungen gibt, und jede dieser Verbindungen tr\u00e4gt das volle Gewicht der Tabelle hinter sich her.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>SELECT wp_posts.ID FROM wp_posts\n  INNER JOIN wp_postmeta pm1 ON wp_posts.ID = pm1.post_id\n  INNER JOIN wp_postmeta pm2 ON wp_posts.ID = pm2.post_id\n  INNER JOIN wp_postmeta pm3 ON wp_posts.ID = pm3.post_id\nWHERE post_type = 'post' AND post_status = 'publish'\n  AND ( pm1.meta_key = '_region' AND pm1.meta_value = 'nord' )\n  AND ( pm2.meta_key = '_stufe'  AND pm2.meta_value = 'b' )\n  AND ( pm3.meta_key = '_aktiv'  AND pm3.meta_value = '1' )\nORDER BY wp_posts.post_date DESC<\/code><\/pre>\n<p>Daran ist nichts falsch. Es ist die w\u00f6rtliche \u00dcbersetzung des Gew\u00fcnschten, und die Datenbank beantwortet sie richtig &#8211; nachdem sie auf einer mittelgro\u00dfen Seite in der Gr\u00f6\u00dfenordnung einer halben Million Zeilen gelesen hat, um vierzig zur\u00fcckzugeben.<\/p>\n<h2>Der Index, den es nicht gibt<\/h2>\n<p><code>wp_postmeta<\/code> tr\u00e4gt drei Indizes: den Prim\u00e4rschl\u00fcssel auf <code>meta_id<\/code>, einen auf <code>post_id<\/code> und einen auf die ersten 191 Zeichen von <code>meta_key<\/code>. Auf <code>meta_value<\/code> gibt es keinen, und es kann sinnvoll auch keinen geben: Die Spalte ist <code>LONGTEXT<\/code>, und ein Index auf eine Textspalte unbegrenzter L\u00e4nge ist entweder ein Pr\u00e4fix oder gar nichts.<\/p>\n<p>Jede Klausel wird deshalb in zwei Bewegungen beantwortet. Die Verbindung findet die Zeilen zu einem Beitrag \u00fcber <code>post_id<\/code> &#8211; schnell, indiziert, genau wof\u00fcr ein Index da ist. Danach wird der Wert innerhalb jeder dieser Zeilen verglichen, eine nach der anderen, ohne Hilfe von irgendwoher. Der Aufwand ist der Zahl der Metazeilen je Beitrag proportional, und die liegt auf einer Seite mit Seitenbaukasten und ein paar Erweiterungen selten unter drei\u00dfig.<\/p>\n<h2>Die Klauseln, die mehr kosten als die anderen<\/h2>\n<table style=\"width:100%;border-collapse:collapse\">\n<thead>\n<tr>\n<th style=\"vertical-align:top\">Klausel<\/th>\n<th>Was die Datenbank daf\u00fcr tun muss<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>'compare' =&gt; '='<\/code><\/td>\n<td>der Grundfall: eine Verbindung, ein Zeichenkettenvergleich je Zeile<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>'compare' =&gt; 'LIKE'<\/code><\/td>\n<td>dasselbe mit Mustervergleich; ein f\u00fchrender Platzhalter schlie\u00dft jede Abk\u00fcrzung aus<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>'type' =&gt; 'NUMERIC'<\/code><\/td>\n<td>legt <code>CAST()<\/code> um die Spalte und nimmt damit die letzte Aussicht auf Indexnutzung<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>'compare' =&gt; 'NOT EXISTS'<\/code><\/td>\n<td>eine LEFT JOIN samt IS-NULL-Pr\u00fcfung &#8211; jede nicht passende Zeile muss erst entstehen<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>'relation' =&gt; 'OR'<\/code><\/td>\n<td>die Klauseln engen einander nicht mehr ein; die Zwischenmenge ist die Vereinigung<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>'orderby' =&gt; 'meta_value'<\/code><\/td>\n<td>eine tempor\u00e4re Tabelle und eine Sortierung \u00fcber eine Textspalte<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Die letzte Zeile macht aus einer langsamen Seite eine Zeit\u00fcberschreitung. Nach einem Metawert zu sortieren, l\u00e4sst sich aus keinem Index bedienen; die Datenbank baut also das gesamte Zwischenergebnis auf und sortiert es &#8211; und weil <code>meta_value<\/code> ein <code>LONGTEXT<\/code> ist, geschieht diese Sortierung auf der Platte statt im Arbeitsspeicher, sobald die Menge gro\u00df wird.<\/p>\n<p><code>NOT EXISTS<\/code> verdient eine eigene Warnung. Es liest sich wie das billige Gegenteil von <code>EXISTS<\/code> und ist das Gegenteil von billig: Abwesenheit nachzuweisen hei\u00dft, jeden Kandidaten zu besuchen &#8211; und das ist genau das, was ein Index nicht abk\u00fcrzen kann.<\/p>\n<h2>Wohin der Filter stattdessen geh\u00f6rt<\/h2>\n<p>Ein Wert, nach dem gefiltert wird, ist keine Eigenschaft eines Beitrags in dem Sinn, in dem ein Untertitel eine ist. Er ist eine Einordnung, und f\u00fcr Einordnungen hat WordPress bereits eine Struktur mit den richtigen Indizes: <code>wp_term_relationships<\/code> ist auf beiden Spalten indiziert, ein Begriffsfilter ist also eine Verbindung, die vollst\u00e4ndig aus Indizes beantwortet wird, ganz ohne Textvergleich.<\/p>\n<p>Die Regel daraus ist kurz. Was gefiltert oder sortiert wird, geh\u00f6rt in eine Taxonomie &#8211; oder, wenn die Werte wirklich zahlenm\u00e4\u00dfig und stetig sind, in eine Spalte einer eigenen Tabelle. Was erst gelesen wird, nachdem der Beitrag gefunden ist, kann in den Metadaten bleiben, wo es genau einen Zugriff \u00fcber <code>post_id<\/code> kostet und sonst nichts.<\/p>\n<h2>Messen statt sch\u00e4tzen<\/h2>\n<p>Die von WP_Query gebaute Abfrage steht vor der Ausf\u00fchrung bereit: In <code>$query-&gt;request<\/code> liegt das fertige SQL, und durch <code>EXPLAIN<\/code> geschickt beantwortet es die einzigen zwei Fragen, auf die es ankommt. Die Spalte <code>rows<\/code> ist die Sch\u00e4tzung, wie viele Zeilen jeder Schritt lesen wird; die Spalte <code>Extra<\/code> benennt die teuren Formen unverbl\u00fcmt, und <code>Using temporary; Using filesort<\/code> zusammen sind die Unterschrift einer Sortierung, die nicht mitw\u00e4chst.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>wp db query \"EXPLAIN SELECT wp_posts.ID FROM wp_posts INNER JOIN ...\"\n\nid  select_type  table     type    key       rows    Extra\n1   SIMPLE       wp_posts  ref     type_st.  4800    Using temporary; Using filesort\n1   SIMPLE       pm1       ref     post_id     40    Using where\n1   SIMPLE       pm2       ref     post_id     40    Using where\n1   SIMPLE       pm3       ref     post_id     40    Using where<\/code><\/pre>\n<p>Drei Zeilen mit <code>Using where<\/code> hinter einem Zugriff \u00fcber <code>post_id<\/code> sind genau das oben beschriebene Bild: Der Index hat die Zeilen gefunden, die Bedingung wurde danach angewandt. Die Zahl in <code>rows<\/code>, \u00fcber die Verbindungen multipliziert, ist die Gr\u00f6\u00dfe, die mit der Seite w\u00e4chst &#8211; und es lohnt sich, sie an dem Tag zu kennen, an dem die Abfrage geschrieben wird, statt an dem, an dem die Seite nicht mehr l\u00e4dt.<\/p>\n<div class=\"lw-quellen\">\n<h2>Quellen<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP_Query reference<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Jede meta_query-Klausel wird zu einer weiteren INNER-JOIN auf wp_postmeta, und wp_postmeta hat auf der verglichenen Spalte keinen Index. Drei Klauseln und eine Sortierung machen aus einer belanglosen Abfrage eine halbe Million Zeilen.<\/p>\n","protected":false},"author":1,"featured_media":15168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[92256,92292],"class_list":["post-10394","post","type-post","status-publish","format-standard","hentry","category-wordpress-plugins-tricks-de","tag-mysql-de","tag-web-performance-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet - Lukas Wojcik - Blog<\/title>\n<meta name=\"description\" content=\"Wie WP_Query aus meta_query Verbindungen baut, warum sich meta_value nicht sinnvoll indizieren l\u00e4sst und welche Filter stattdessen in eine Taxonomie geh\u00f6ren.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Wie WP_Query aus meta_query Verbindungen baut, warum sich meta_value nicht sinnvoll indizieren l\u00e4sst und welche Filter stattdessen in eine Taxonomie geh\u00f6ren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-12T10:30:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"luky\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"luky\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/\"},\"author\":{\"name\":\"luky\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet\",\"datePublished\":\"2026-09-12T10:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/\"},\"wordCount\":792,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png\",\"keywords\":[\"MySQL\",\"Web Performance\"],\"articleSection\":[\"WordPress-Plugins &amp; Tricks\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/\",\"name\":\"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png\",\"datePublished\":\"2026-09-12T10:30:00+00:00\",\"description\":\"Wie WP_Query aus meta_query Verbindungen baut, warum sich meta_value nicht sinnvoll indizieren l\u00e4sst und welche Filter stattdessen in eine Taxonomie geh\u00f6ren.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png\",\"width\":1200,\"height\":630,\"caption\":\"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/wordpress-plugins-tricks-de\\\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/author\\\/luky\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet - Lukas Wojcik - Blog","description":"Wie WP_Query aus meta_query Verbindungen baut, warum sich meta_value nicht sinnvoll indizieren l\u00e4sst und welche Filter stattdessen in eine Taxonomie geh\u00f6ren.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/","og_locale":"en_US","og_type":"article","og_title":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet - Lukas Wojcik - Blog","og_description":"Wie WP_Query aus meta_query Verbindungen baut, warum sich meta_value nicht sinnvoll indizieren l\u00e4sst und welche Filter stattdessen in eine Taxonomie geh\u00f6ren.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-12T10:30:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png","type":"image\/png"}],"author":"luky","twitter_card":"summary_large_image","twitter_misc":{"Written by":"luky","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/"},"author":{"name":"luky","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet","datePublished":"2026-09-12T10:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/"},"wordCount":792,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png","keywords":["MySQL","Web Performance"],"articleSection":["WordPress-Plugins &amp; Tricks"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/","name":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png","datePublished":"2026-09-12T10:30:00+00:00","description":"Wie WP_Query aus meta_query Verbindungen baut, warum sich meta_value nicht sinnvoll indizieren l\u00e4sst und welche Filter stattdessen in eine Taxonomie geh\u00f6ren.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10394-eine-klausel-eine-verbindung-was-met-n.png","width":1200,"height":630,"caption":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/wordpress-plugins-tricks-de\/meta_query-in-wp_query-wie-jede-klausel-zu-einem-join-wird\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"meta_query in WP_Query: Wie jede Klausel zu einem Join wird und was das kostet"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"],"url":"https:\/\/www.lukaswojcik.com\/blog\/author\/luky\/"}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10394"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10394\/revisions"}],"predecessor-version":[{"id":17432,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10394\/revisions\/17432"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/15168"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}