Extreme Performance-Unterschiede zwischen MariaDB und MySQL? – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sat, 29 Feb 20 23:48:29 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766113#m1766113 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766113#m1766113 <p>Liebe Mitlesende,</p> <p>ich stehe vor einem Rätsel. Auf dem Produktivsystem läuft ein MySQL-Server Version 5.7 und auf dem Test-/Entwicklungssystem ein MariaDB-Server Version 10.1.44. Eine spezielle Query (siehe unten) dauert auf dem MariaDB-Server 0,05 Sekunden, auf dem MySQL-Server stolze 20,5 Sekunden. In phpMyAdmin habe ich mir den Aufruf jeweils messen und erklären lassen. Die Ausgaben sind so unterschiedlich, dass ich nicht verstehe, warum und wo genau das Problem liegt.</p> <p><em>Wer hat Hinweise oder Ideen, worin der Performance-Unterschied bei den beiden Servern liegen könnte?</em></p> <p>Im Folgenden nun die Auflistungen unter "Detailliertes Profil":</p> <p>MariaDB</p> <table> <thead> <tr> <th>Reihenfolge</th> <th>Status</th> <th>Zeit</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Starting</td> <td>19 µs</td> </tr> <tr> <td>2</td> <td>Waiting For Query Cache Lock</td> <td>4 µs</td> </tr> <tr> <td>3</td> <td>Init</td> <td>3 µs</td> </tr> <tr> <td>4</td> <td>Checking Query Cache For Query</td> <td>12 µs</td> </tr> <tr> <td>5</td> <td>Checking Privileges On Cached</td> <td>11 µs</td> </tr> <tr> <td>6</td> <td>Checking Permissions</td> <td>11 µs</td> </tr> <tr> <td>7</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>8</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>9</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>10</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>11</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>12</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>13</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>14</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>15</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>16</td> <td>Checking Permissions</td> <td>4 µs</td> </tr> <tr> <td>17</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>18</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>19</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>20</td> <td>Sending Cached Result To Clien</td> <td>11 µs</td> </tr> <tr> <td>21</td> <td>Updating Status</td> <td>4 µs</td> </tr> <tr> <td>22</td> <td>Cleaning Up</td> <td>4 µs</td> </tr> </tbody> </table> <p>MySQL</p> <table> <thead> <tr> <th>Reihenfolge</th> <th>Status</th> <th>Zeit</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>2</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>3</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>4</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>5</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>6</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>7</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>8</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>9</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>10</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>11</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>12</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>13</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>14</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>15</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>16</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>17</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>18</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>19</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>20</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>21</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>22</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>23</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>24</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>25</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>26</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>27</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>28</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>29</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>30</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>31</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>32</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>33</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>34</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>35</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>36</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>37</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>38</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>39</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>40</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>41</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>42</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>43</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>44</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>45</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>46</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>47</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>48</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>49</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>50</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>51</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>52</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>53</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>54</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>55</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>56</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>57</td> <td>Sending Data</td> <td>41 µs</td> </tr> <tr> <td>58</td> <td>Executing</td> <td>3 µs</td> </tr> <tr> <td>59</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>60</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>61</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>62</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>63</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>64</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>65</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>66</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>67</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>68</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>69</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>70</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>71</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>72</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>73</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>74</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>75</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>76</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>77</td> <td>Sending Data</td> <td>1,4 ms</td> </tr> <tr> <td>78</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>79</td> <td>Sending Data</td> <td>1,4 ms</td> </tr> <tr> <td>80</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>81</td> <td>Sending Data</td> <td>1,4 ms</td> </tr> <tr> <td>82</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>83</td> <td>Sending Data</td> <td>1,4 ms</td> </tr> <tr> <td>84</td> <td>Executing</td> <td>4 µs</td> </tr> <tr> <td>85</td> <td>Sending Data</td> <td>1,4 ms</td> </tr> <tr> <td>86</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>87</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>88</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>89</td> <td>Sending Data</td> <td>1,4 ms</td> </tr> <tr> <td>90</td> <td>End</td> <td>8 µs</td> </tr> <tr> <td>91</td> <td>Query End</td> <td>7 µs</td> </tr> <tr> <td>92</td> <td>Removing Tmp Table</td> <td>8 µs</td> </tr> <tr> <td>93</td> <td>Query End</td> <td>64 µs</td> </tr> <tr> <td>94</td> <td>Removing Tmp Table</td> <td>4 µs</td> </tr> <tr> <td>95</td> <td>Query End</td> <td>7 µs</td> </tr> <tr> <td>96</td> <td>Removing Tmp Table</td> <td>13 µs</td> </tr> <tr> <td>97</td> <td>Query End</td> <td>5 µs</td> </tr> <tr> <td>98</td> <td>Closing Tables</td> <td>30 µs</td> </tr> <tr> <td>99</td> <td>Freeing Items</td> <td>34 µs</td> </tr> <tr> <td>100</td> <td>Cleaning Up</td> <td>12 µs</td> </tr> </tbody> </table> <p>Der SQL-Code der Query ist 60 Zeilen lang:</p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> <span class="token keyword">DISTINCT</span> <span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>alt_exam<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>date<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>start<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>student<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>sex<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>call_name<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>first_name<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>name_affix<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>family_name<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>name_suffix<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token identifier"><span class="token punctuation">`</span>students<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>form<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token keyword">DISTINCT</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>subject<span class="token punctuation">`</span></span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>course_name<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>course_name<span class="token punctuation">`</span></span> <span class="token operator">AND</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token operator"><</span><span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>date<span class="token punctuation">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">AS</span> <span class="token identifier"><span class="token punctuation">`</span>subject<span class="token punctuation">`</span></span><span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> GROUP_CONCAT<span class="token punctuation">(</span><span class="token keyword">DISTINCT</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>teacher<span class="token punctuation">`</span></span> <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>teacher<span class="token punctuation">`</span></span> SEPARATOR <span class="token string">'|%|'</span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>lesson_id<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>lesson_id<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>course_name<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>course_name<span class="token punctuation">`</span></span> <span class="token operator">AND</span> <span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token operator"><=</span><span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>date<span class="token punctuation">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">AS</span> <span class="token identifier"><span class="token punctuation">`</span>teachers<span class="token punctuation">`</span></span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>alt_exam<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>alt_exam<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>students<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>student<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>students<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>student<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>students<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>person<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>people<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>person<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>date<span class="token punctuation">`</span></span><span class="token operator">>=</span><span class="token string">'2019-09-22'</span> <span class="token operator">AND</span> <span class="token keyword">EXISTS</span> <span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>teacher<span class="token punctuation">`</span></span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>lesson_id<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>lesson_id<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>staff<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>lesson_teachers<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>teacher<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>staff<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>shorthand<span class="token punctuation">`</span></span> <span class="token keyword">JOIN</span> <span class="token identifier"><span class="token punctuation">`</span>users<span class="token punctuation">`</span></span> <span class="token keyword">ON</span> <span class="token identifier"><span class="token punctuation">`</span>staff<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>person<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>users<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>person<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>course_name<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token identifier"><span class="token punctuation">`</span>alt_bookings<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>course_name<span class="token punctuation">`</span></span> <span class="token operator">AND</span> <span class="token identifier"><span class="token punctuation">`</span>lessons<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token punctuation">(</span> <span class="token keyword">SELECT</span> <span class="token function">MAX</span><span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">FROM</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span> <span class="token keyword">WHERE</span> <span class="token identifier"><span class="token punctuation">`</span>courses<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>schedule<span class="token punctuation">`</span></span><span class="token operator"><=</span><span class="token identifier"><span class="token punctuation">`</span>alt_exams<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>date<span class="token punctuation">`</span></span> <span class="token punctuation">)</span> <span class="token operator">AND</span> <span class="token identifier"><span class="token punctuation">`</span>users<span class="token punctuation">`</span></span><span class="token punctuation">.</span><span class="token identifier"><span class="token punctuation">`</span>login<span class="token punctuation">`</span></span><span class="token operator">=</span><span class="token string">''</span> <span class="token operator">OR</span> <span class="token number">1</span><span class="token operator">=</span><span class="token number">1</span> <span class="token comment">-- privileged users --</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 05:37:08 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766118#m1766118 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766118#m1766118 <p>Hallo Felix Riesterer,</p> <p>Es steht 44 Mal "sending Data" mit 1,3 oder 1,4 ms. Liegt da nicht der Verdacht nahe, dass der Weg vom Client zum Server berücksichtigt werden muss?</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 06:29:12 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766121#m1766121 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766121#m1766121 <p>Hi,</p> <blockquote> <p>ich stehe vor einem Rätsel. Auf dem Produktivsystem läuft ein MySQL-Server Version 5.7 und auf dem Test-/Entwicklungssystem ein MariaDB-Server Version 10.1.44. Eine spezielle Query (siehe unten) dauert auf dem MariaDB-Server 0,05 Sekunden, auf dem MySQL-Server stolze 20,5 Sekunden.</p> </blockquote> <p>Sind die Datenmengen identisch?</p> <p>Sind dieselben Indizes gesetzt?</p> <p>Was ergibt explain für das Statement auf den beiden DBs?</p> <p>cu,<br> Andreas a/k/a MudGuard</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 10:20:53 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766135#m1766135 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766135#m1766135 <p>Hallo Felix,</p> <blockquote> <p><em>Wer hat Hinweise oder Ideen, worin der Performance-Unterschied bei den beiden Servern liegen könnte?</em></p> </blockquote> <p>Ein <code>EXPLAIN</code> sowie die Datenstrukturen sollten bei so einer Frage nicht fehlen.</p> <p>Es fällt jedoch auf:</p> <blockquote> <table> <thead> <tr> <th>Reihenfolge</th> <th>Status</th> <th>Zeit</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Starting</td> <td>19 µs</td> </tr> <tr> <td>2</td> <td>Waiting For Query Cache Lock</td> <td>4 µs</td> </tr> <tr> <td>3</td> <td>Init</td> <td>3 µs</td> </tr> <tr> <td>4</td> <td>Checking Query Cache For Query</td> <td>12 µs</td> </tr> <tr> <td>5</td> <td>Checking Privileges On Cached</td> <td>11 µs</td> </tr> <tr> <td>6</td> <td>Checking Permissions</td> <td>11 µs</td> </tr> <tr> <td>7</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>8</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>9</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>10</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>11</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>12</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>13</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>14</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>15</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>16</td> <td>Checking Permissions</td> <td>4 µs</td> </tr> <tr> <td>17</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>18</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>19</td> <td>Checking Permissions</td> <td>3 µs</td> </tr> <tr> <td>20</td> <td>Sending Cached Result To Clien</td> <td>11 µs</td> </tr> <tr> <td>21</td> <td>Updating Status</td> <td>4 µs</td> </tr> <tr> <td>22</td> <td>Cleaning Up</td> <td>4 µs</td> </tr> </tbody> </table> </blockquote> <p>Die Query kommt direkt aus dem Cache und wir in einem Rutsch rübergeschickt (siehe <em>Checking Query Cache For Query</em> und <em>Checking Privileges On Cached</em>). Um das realistisch zu prüfen würde ich den Cache auf der Entwicklungsmaschine mal deaktivieren (<code>query_cache_size</code> und <code>query_cache_type</code> in der <code>my.cnf</code> auf <code>0</code> setzen und MariaDB neu starten).</p> <blockquote> <table> <thead> <tr> <th>Reihenfolge</th> <th>Status</th> <th>Zeit</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Sending Data</td> <td>1,3 ms</td> </tr> <tr> <td>2</td> <td>Executing</td> <td>5 µs</td> </tr> <tr> <td>[…]</td> <td></td> <td></td> </tr> <tr> <td>90</td> <td>End</td> <td>8 µs</td> </tr> <tr> <td>91</td> <td>Query End</td> <td>7 µs</td> </tr> <tr> <td>92</td> <td>Removing Tmp Table</td> <td>8 µs</td> </tr> <tr> <td>93</td> <td>Query End</td> <td>64 µs</td> </tr> <tr> <td>94</td> <td>Removing Tmp Table</td> <td>4 µs</td> </tr> <tr> <td>95</td> <td>Query End</td> <td>7 µs</td> </tr> <tr> <td>96</td> <td>Removing Tmp Table</td> <td>13 µs</td> </tr> <tr> <td>97</td> <td>Query End</td> <td>5 µs</td> </tr> <tr> <td>98</td> <td>Closing Tables</td> <td>30 µs</td> </tr> <tr> <td>99</td> <td>Freeing Items</td> <td>34 µs</td> </tr> <tr> <td>100</td> <td>Cleaning Up</td> <td>12 µs</td> </tr> </tbody> </table> </blockquote> <p>Hier werden drei temporäre Tabellen erstellt. Außerdem wird das Ergebnis sehr fragmentiert übertragen (siehe die vielen <code>executing</code> und <code>sending</code>-Einträge). Ist der MySQL-Server auf der gleichen Maschine? Ist Netzwerk ein Flaschenhals? Wie groß ist das Resultset? Wie sieht die Speicher-Auslastung auf der DB-Maschine aus? Prüfe auch, ob der Tablespace für temporäre Tabellen auf einer drehenden Platte ist oder auf einer SSD. Prüfe vielleicht, warum der Server überhaupt temporäre Tabellen erstellen muss: ist er vielleicht unter memory pressure? Wie sieht die IO-Auslastung aus?</p> <p>Das sind alles Allgemeinplätze, aber viel mehr kann man dazu nicht sagen ohne genauere Informationen…</p> <blockquote> <p>Der SQL-Code der Query ist 60 Zeilen lang:</p> <p>[…]</p> </blockquote> <p>Drei correlating subqueries – ist vielleicht auch nicht so optimal. Das könnte schon auch ein Grund für die temporären Tabellen sein. Kannst du das vielleicht umformulieren?</p> <p>Freundliche Grüße,<br> Christian Kruse</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 10:52:53 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766143#m1766143 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766143#m1766143 <p>Welchen Datentyp hat <code>alt_exams</code>.<code>date</code>? Wirklich ein String, wie die Query vermuten lässt?</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 10:47:06 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766141#m1766141 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766141#m1766141 <p>Lieber Matthias,</p> <blockquote> <p>Es steht 44 Mal "sending Data" mit 1,3 oder 1,4 ms. Liegt da nicht der Verdacht nahe, dass der Weg vom Client zum Server berücksichtigt werden muss?</p> </blockquote> <p>es liegt vor allem der Verdacht nahe, dass meine Anfrage ungünstig formuliert ist. Momentan tendiere ich dazu, diese ganzen Zuordnungen in PHP zu lösen, anstatt sie dem SQL-Server aufzubürden.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 10:46:03 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766140#m1766140 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766140#m1766140 <p>Lieber MudGuard,</p> <blockquote> <p>Sind die Datenmengen identisch?</p> </blockquote> <p>ja.</p> <blockquote> <p>Sind dieselben Indizes gesetzt?</p> </blockquote> <p>Ja.</p> <blockquote> <p>Was ergibt explain für das Statement auf den beiden DBs?</p> </blockquote> <p>Das habe ich in <a href="https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766139#m1766139" rel="noopener noreferrer">meiner Antwort an Christian</a> gelistet. Nach dem Deaktivieren des Caches sieht das bei beiden gleich aus.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Tue, 03 Mar 20 20:17:21 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766329#m1766329 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766329#m1766329 <p>Hello,</p> <p>[•••]<br> sind die Server gleich oder ähnlich konfiguriert bezüglich Engines, Buffers, Memory, usw.?</p> <p>Wid ist die Prozessor- und Speicherausstattung der Systeme? Hat vielleicht das MariaDB-System eine SSD und das MySQL-System noch eine Spin-HDD?</p> <p>Um die Ursache zu finden, müsste Felix vielleicht erstmal gezielte Teststatements/-einrichtungen basteln und absetzen.</p> <p>Glück Auf<br> Tom mobil</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 10:44:55 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766139#m1766139 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766139#m1766139 <p>Lieber Christian,</p> <p>ich habe den Cache auf 0 gesetzt und sehe, dass dann ebenfalls 100 Teilschritte entstehen. Sie dauern aber Microsekunden, anstatt Millisekunden. Das mag daran liegen, dass auf meinem Testsystem der Apache und der MariaDB-Server auf derselben Maschine liegen, auf dem Webspace aber nicht.</p> <blockquote> <p>Ein <code>EXPLAIN</code> sowie die Datenstrukturen sollten bei so einer Frage nicht fehlen.</p> </blockquote> <p>Das sieht bei beiden sehr ähnlich aus:</p> <p>MariaDB</p> <table> <thead> <tr> <th>id</th> <th>select_type</th> <th>table</th> <th>type</th> <th>possible_keys</th> <th>key</th> <th>key_len</th> <th>ref</th> <th>rows</th> <th>Extra</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>PRIMARY</td> <td>alt_exams</td> <td>ALL</td> <td>PRIMARY</td> <td>NULL</td> <td>NULL</td> <td>NULL</td> <td>18</td> <td>Using where; Using temporary</td> </tr> <tr> <td>1</td> <td>PRIMARY</td> <td>alt_bookings</td> <td>ref</td> <td>PRIMARY,alt_exam,student</td> <td>PRIMARY</td> <td>4</td> <td>school_2019_2020.alt_exams.alt_exam</td> <td>9</td> <td>Using where</td> </tr> <tr> <td>1</td> <td>PRIMARY</td> <td>students</td> <td>eq_ref</td> <td>PRIMARY,person</td> <td>PRIMARY</td> <td>4</td> <td>school_2019_2020.alt_bookings.student</td> <td>1</td> <td></td> </tr> <tr> <td>1</td> <td>PRIMARY</td> <td>people</td> <td>eq_ref</td> <td>PRIMARY</td> <td>PRIMARY</td> <td>4</td> <td>school_2019_2020.students.person</td> <td>1</td> <td></td> </tr> <tr> <td>6</td> <td>SUBQUERY</td> <td>users</td> <td>index</td> <td>person</td> <td>person</td> <td>6</td> <td>NULL</td> <td>78</td> <td>Using index</td> </tr> <tr> <td>6</td> <td>SUBQUERY</td> <td>staff</td> <td>eq_ref</td> <td>PRIMARY,shorthand</td> <td>PRIMARY</td> <td>4</td> <td>school_2019_2020.users.person</td> <td>1</td> <td>Using where</td> </tr> <tr> <td>6</td> <td>SUBQUERY</td> <td>lesson_teachers</td> <td>ref</td> <td>PRIMARY,lesson_id,teacher</td> <td>teacher</td> <td>62</td> <td>school_2019_2020.staff.shorthand</td> <td>80</td> <td>Using where; Using index</td> </tr> <tr> <td>6</td> <td>SUBQUERY</td> <td>lessons</td> <td>eq_ref</td> <td>PRIMARY</td> <td>PRIMARY</td> <td>4</td> <td>school_2019_2020.lesson_teachers.lesson_id</td> <td>1</td> <td></td> </tr> <tr> <td>7</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>index</td> <td>PRIMARY,schedule</td> <td>schedule</td> <td>5</td> <td>NULL</td> <td>4479</td> <td>Using where; Using index</td> </tr> <tr> <td>4</td> <td>DEPENDENT SUBQUERY</td> <td>lessons</td> <td>ref</td> <td>PRIMARY,schedule,course_name</td> <td>course_name</td> <td>602</td> <td>school_2019_2020.alt_bookings.course_name</td> <td>10</td> <td>Using index condition; Using where</td> </tr> <tr> <td>4</td> <td>DEPENDENT SUBQUERY</td> <td>lesson_teachers</td> <td>ref</td> <td>PRIMARY,lesson_id</td> <td>PRIMARY</td> <td>4</td> <td>school_2019_2020.lessons.lesson_id</td> <td>1</td> <td>Using index</td> </tr> <tr> <td>5</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>index</td> <td>PRIMARY,schedule</td> <td>schedule</td> <td>5</td> <td>NULL</td> <td>4479</td> <td>Using where; Using index</td> </tr> <tr> <td>2</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>eq_ref</td> <td>PRIMARY,schedule,course_name</td> <td>PRIMARY</td> <td>605</td> <td>func,school_2019_2020.alt_bookings.course_name</td> <td>1</td> <td>Using where; Using temporary</td> </tr> <tr> <td>3</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>index</td> <td>PRIMARY,schedule</td> <td>schedule</td> <td>5</td> <td>NULL</td> <td>4479</td> <td>Using where; Using index</td> </tr> </tbody> </table> <p>MySQL</p> <table> <thead> <tr> <th>id</th> <th>select_type</th> <th>table</th> <th>partitions</th> <th>type</th> <th>possible_keys</th> <th>key</th> <th>key_len</th> <th>ref</th> <th>rows</th> <th>filtered</th> <th>Extra</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>PRIMARY</td> <td>alt_exams</td> <td>NULL</td> <td>ALL</td> <td>PRIMARY</td> <td>NULL</td> <td>NULL</td> <td>NULL</td> <td>18</td> <td>33.33</td> <td>Using where; Using temporary</td> </tr> <tr> <td>1</td> <td>PRIMARY</td> <td>alt_bookings</td> <td>NULL</td> <td>ref</td> <td>PRIMARY,alt_exam,student</td> <td>PRIMARY</td> <td>4</td> <td>school.alt_exams.alt_exam</td> <td>23</td> <td>100.00</td> <td>Using where</td> </tr> <tr> <td>1</td> <td>PRIMARY</td> <td>students</td> <td>NULL</td> <td>eq_ref</td> <td>PRIMARY,person</td> <td>PRIMARY</td> <td>4</td> <td>school.alt_bookings.student</td> <td>1</td> <td>100.00</td> <td>NULL</td> </tr> <tr> <td>1</td> <td>PRIMARY</td> <td>people</td> <td>NULL</td> <td>eq_ref</td> <td>PRIMARY</td> <td>PRIMARY</td> <td>4</td> <td>school.students.person</td> <td>1</td> <td>100.00</td> <td>NULL</td> </tr> <tr> <td>6</td> <td>DEPENDENT SUBQUERY</td> <td>users</td> <td>NULL</td> <td>index</td> <td>person</td> <td>person</td> <td>4</td> <td>NULL</td> <td>78</td> <td>100.00</td> <td>Using index</td> </tr> <tr> <td>6</td> <td>DEPENDENT SUBQUERY</td> <td>staff</td> <td>NULL</td> <td>eq_ref</td> <td>PRIMARY,shorthand</td> <td>PRIMARY</td> <td>4</td> <td>school.users.person</td> <td>1</td> <td>100.00</td> <td>Using where</td> </tr> <tr> <td>6</td> <td>DEPENDENT SUBQUERY</td> <td>lesson_teachers</td> <td>NULL</td> <td>ref</td> <td>PRIMARY,lesson_id,teacher</td> <td>teacher</td> <td>62</td> <td>school.staff.shorthand</td> <td>160</td> <td>100.00</td> <td>Using where; Using index</td> </tr> <tr> <td>6</td> <td>DEPENDENT SUBQUERY</td> <td>lessons</td> <td>NULL</td> <td>eq_ref</td> <td>PRIMARY</td> <td>PRIMARY</td> <td>4</td> <td>school.lesson_teachers.lesson_id</td> <td>1</td> <td>100.00</td> <td>NULL</td> </tr> <tr> <td>7</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>NULL</td> <td>ALL</td> <td>PRIMARY,schedule</td> <td>NULL</td> <td>NULL</td> <td>NULL</td> <td>4479</td> <td>33.33</td> <td>Range checked for each record (index map: 0x5)</td> </tr> <tr> <td>4</td> <td>DEPENDENT SUBQUERY</td> <td>lessons</td> <td>NULL</td> <td>ref</td> <td>PRIMARY,schedule,course_name</td> <td>course_name</td> <td>602</td> <td>school.alt_bookings.course_name</td> <td>21</td> <td>100.00</td> <td>Using index condition; Using where</td> </tr> <tr> <td>4</td> <td>DEPENDENT SUBQUERY</td> <td>lesson_teachers</td> <td>NULL</td> <td>ref</td> <td>PRIMARY,lesson_id</td> <td>lesson_id</td> <td>4</td> <td>school.lessons.lesson_id</td> <td>1</td> <td>100.00</td> <td>Using index</td> </tr> <tr> <td>5</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>NULL</td> <td>ALL</td> <td>PRIMARY,schedule</td> <td>NULL</td> <td>NULL</td> <td>NULL</td> <td>4479</td> <td>33.33</td> <td>Range checked for each record (index map: 0x5)</td> </tr> <tr> <td>2</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>NULL</td> <td>ref</td> <td>PRIMARY,subject,schedule,course_name</td> <td>PRIMARY</td> <td>3</td> <td>func</td> <td>559</td> <td>10.00</td> <td>Using where; Using temporary</td> </tr> <tr> <td>3</td> <td>DEPENDENT SUBQUERY</td> <td>courses</td> <td>NULL</td> <td>ALL</td> <td>PRIMARY,schedule</td> <td>NULL</td> <td>NULL</td> <td>NULL</td> <td>4479</td> <td>33.33</td> <td>Range checked for each record (index map: 0x5)</td> </tr> </tbody> </table> <blockquote> <p>Hier werden drei temporäre Tabellen erstellt. Außerdem wird das Ergebnis sehr fragmentiert übertragen (siehe die vielen <code>executing</code> und <code>sending</code>-Einträge).</p> </blockquote> <p>Ich kann es noch nicht besser, sonst würde ich meine Anfrage sicherlich günstiger formulieren.</p> <blockquote> <p>Ist der MySQL-Server auf der gleichen Maschine?</p> </blockquote> <p>Offensichtlich nicht. Es handelt sich um ein <em>shared webhosting</em> Paket.</p> <blockquote> <p>Ist Netzwerk ein Flaschenhals?</p> </blockquote> <p>Das kann ich nicht beurteilen.</p> <blockquote> <p>Wie groß ist das Resultset?</p> </blockquote> <p>Weniger als 500 Zeilen.</p> <blockquote> <p>Wie sieht die Speicher-Auslastung auf der DB-Maschine aus? Prüfe auch, ob der Tablespace für temporäre Tabellen auf einer drehenden Platte ist oder auf einer SSD.</p> </blockquote> <p>Das ist in einem Rechenzentrum... k.A.</p> <blockquote> <p>Drei correlating subqueries – ist vielleicht auch nicht so optimal. Das könnte schon auch ein Grund für die temporären Tabellen sein. Kannst du das vielleicht umformulieren?</p> </blockquote> <p>Wenn ich wüsste, wie man das macht! Momentan tendiere ich dazu, die Abfrage allgemeiner zu halten und die Zuordnungen per PHP-Script zu leisten.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 13:06:47 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766153#m1766153 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766153#m1766153 <p>Hallo Felix,</p> <p>wenn Du die Zuordnungen in PHP löst, dann musst Du trotzdem aufpassen. Es darf nicht passieren, dass Du nachher pro Result-Row eine oder mehrere Extraqueries absetzt. Das wäre bei 500 Rows viel zu langsam.</p> <p>Die Query wird dadurch verkompliziert, dass die DB hoch normalisiert zu sein scheint. Das ist nicht immer gut. Eine Query über 9 Tabellen ist schon heftig.</p> <p>Beispiel: Welche Users gibt es, außer Staff? Was sind die Extra-Attribute in Staff? Wenn es nur wenige Attribute sind, lohnt es sich, Staff in Users zu integrieren und ein Attribut user_type einzuführen. Das ist dann nicht Normalform, aber performanter. Denormalisierung ist oft die Schmiere im DB Getriebe. Eine noch normalisierte DB braucht viel Cache, damit die Joins nicht in die Knie gehen. Ähnliches gilt für students und people. Welche Leute gibt es noch, außer Schülern? Besteht eine Relation zwischen people und users? Kann es sinnvoll sein, auch hier zusammen zu legen? Ok, es mag zu spät dafür sein, weil zuviel Legacy Code da ist.</p> <p>Es scheint auch einen Modellfehler zu geben. <code>students.form</code> ist ein Attribut, das nicht nur vom Schüler abhängt, sondern auch vom Datum. Oder ist das nur der Zug, in dem der Schüler ist? Aber auch der mag sich ändern; es mag Gründe geben warum ein Schüler von der 5a in die 6b wechselt (z.B. je nach Wahl der 2. Fremdsprache, oder weil die a ihn mobbt). D.h. die Angabe der Klasse (form) gehört an die Kursbuchung. Schüler Willi bucht 2019/20 den Kurs Latein-3 und gehört dann der 8c an.</p> <p>Ist form ein Attribut des Schülers, bekommst Du Probleme beim Abruf von Daten des Vorjahres. Willi ist mittlerweile in der 9c, aber wenn Du Kurse vom letzten Schuljahr abfragst, war er noch in der 8c. Du kannst auch nicht einfach 1 abziehen, weil Willi ja nicht in der 9c sein <strong>muss</strong>. Er kann auch sitzen geblieben oder gesprungen sein.</p> <p>Was soll die Query eigentlich liefern? Prüfungen ab dem 22.9.19 und die zugehörigen Schüler, und zwar für Kurse, wo ein Lehrer mit leerem user-login existiert. Für den geprüften Kurs noch das letzte Subject vor dem Prüfungsdatum - hä? Wofür steht eine Row in einem Kurs, und was für ein Datum ist schedule? Was ist das subject eines Kurses? Deutsch? Oder "Gedichtinterpretation" - das hätte ich aber eher an der Lesson vermutet. Ich bin auch nicht sicher, dass Du den DISTINCT bei dieser Subquery brauchst, du suchst doch den Kurseintrag mit dem höchsten Schedule-Wert vor der Prüfung, und da gibt's doch vermutlich nur einen, oder? Ich hab ja keine Ahnung was Du in courses genau drin hast </p> <p>Und dann werden noch die Lehrer hinzugemixt, die zum Kurs eine Lektion erteilt haben, und zwar nur die, die am oder jüngstes vor dem Prüfungsdatum stattfand (hier ist <=, beim anderen Subselect ist <, ist das korrekt?)</p> <p>Das sieht nach einem SEHR ungewöhnlichen fachlichen Szenario aus. Wenn Du hier Hilfestellung bei einer besseren Query willst, müsstest Du etwas mehr davon erzählen. Das mag dann aber zu viel über eure Schulinterna enthalten.</p> <p>Es sieht jedenfalls danach aus, als ob die Lehrer ohne Login der Kern der Sache sind. Oder gehört da eigentlich eine konkrete Login-ID hin und du hast sie weganonymisiert?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 15:37:26 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766161#m1766161 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766161#m1766161 <p>Lieber Rolf,</p> <blockquote> <p>Die Query wird dadurch verkompliziert, dass die DB hoch normalisiert zu sein scheint.</p> </blockquote> <p>ja, die Normalisierung habe ich so hoch umgesetzt, wie es mir möglich war.</p> <blockquote> <p>Das ist nicht immer gut. Eine Query über 9 Tabellen ist schon heftig.</p> </blockquote> <p>Das mag sein, dafür sind die Datenmengen aber überschaubar.</p> <blockquote> <p>Beispiel: Welche Users gibt es, außer Staff?</p> </blockquote> <p>Momentan keine. Der eine Sonderfall läuft über Staff.</p> <blockquote> <p>Was sind die Extra-Attribute in Staff?</p> </blockquote> <p>Das, was <code>people</code> zu <code>staff</code> macht. Du hast sicher gleich verstanden, dass hier die Mitglieder einer Schulgemeinschaft abgebildet werden. Wir haben Schülerinnen und Schüler (SuS), Kolleginnen und Kollegen (KuK), Eltern und weitere Mitarbeiter. Und da ergibt es sich nun mal, dass manche Menschen mehrere Dinge auf einmal sind, wie z.B. Lehrkräfte, die auch Eltern von SuS an unserer Schule sind. Daher gibt es auch <code>parents</code> und <code>guardians</code>, um Elternschaft von Sorgeberechtigung getrennt zu verwalten, und eben auch <code>students</code>.</p> <blockquote> <p>Wenn es nur wenige Attribute sind, lohnt es sich, Staff in Users zu integrieren und ein Attribut user_type einzuführen. Das ist dann nicht Normalform, aber performanter.</p> </blockquote> <p>Darüber könnte man echt nachdenken, aber vielleicht wächst das Projekt irgendwann in eine Richtung, in der auch Eltern oder gar SuS zu Usern werden können. Da will ich das Datenmodell nicht schon wieder anfassen müssen.</p> <blockquote> <p>Denormalisierung ist oft die Schmiere im DB Getriebe.</p> </blockquote> <p>So wahr mir Codd helfe.</p> <blockquote> <p>Eine noch normalisierte DB braucht viel Cache, damit die Joins nicht in die Knie gehen. Ähnliches gilt für students und people. Welche Leute gibt es noch, außer Schülern? Besteht eine Relation zwischen people und users? Kann es sinnvoll sein, auch hier zusammen zu legen? Ok, es mag zu spät dafür sein, weil zuviel Legacy Code da ist.</p> </blockquote> <p>Wie oben schon beschrieben, stehen zunächst alle Mitglieder der Schulgemeinschaft (lies: alle Menschen) in der Tabelle <code>people</code>. Die Beziehungen mit anderen Tabellen stellen dann dar, welche Rolle eine Person an der Schule spielt.</p> <p>Was den Legacy-Code angeht, so ist das mein Projekt, das ich eh immer wieder kräftig umkremple, wenn das Datenmodell so nicht passt, damit eben so etwas wie eine Abhängigkeit von Legacy-Code nicht gegeben ist. Wenn ich falsche Design-Entscheidungen getroffen haben sollte, dann muss ich die korrigieren und nicht das Argument des Legacy-Codes anführen! Dafür ist das Projekt auch gottseidank überschaubar genug.</p> <blockquote> <p>Es scheint auch einen Modellfehler zu geben. <code>students.form</code> ist ein Attribut, das nicht nur vom Schüler abhängt, sondern auch vom Datum.</p> </blockquote> <p>Das ist nicht der Fall. Aber es gibt SuS, die im Verlauf des Schuljahres abgemeldet werden, weil sie die Schule wechseln. Diese müssen in bestimmten Kontexten herausgefiltert werden.</p> <p>Außerdem gibt es anlassbezogen immer wieder neue Stundenplanversionen im Schuljahr, die neue Kursbildungen notwendig machen können. Daher sind die Kurse mit einem Stundenplan verknüpft, der ein Start-Datum hat.</p> <blockquote> <p>Oder ist das nur der Zug, in dem der Schüler ist? Aber auch der mag sich ändern; es mag Gründe geben warum ein Schüler von der 5a in die 6b wechselt (z.B. je nach Wahl der 2. Fremdsprache, oder weil die a ihn mobbt). D.h. die Angabe der Klasse (form) gehört an die Kursbuchung. Schüler Willi bucht 2019/20 den Kurs Latein-3 und gehört dann der 8c an.</p> </blockquote> <p>Eine Klasse ist eine Klasse. Ein Kurs ist ein Kurs. Das eine hat mit dem anderen rein datentechnisch nichts zu tun.</p> <p>Der Mathe-Unterricht in der 6c ist ein Kurs. Die 6c ist eine Klasse. Die Teilnehmergruppe des Mathe-Kurses ist identisch mit der Klassenliste der 6c. Das gilt auch für das Fach Deutsch, aber nicht unbedingt in allen anderen Fächern. Daher unterscheide ich grundsätzlich zwischen "Klasse" (administrative Kategorie) und "Kurs" (Unterrichtsgruppe mit Fach).</p> <blockquote> <p>Ist form ein Attribut des Schülers, bekommst Du Probleme beim Abruf von Daten des Vorjahres.</p> </blockquote> <p>Nein. Die Vorjahre sind archivierte Vorversionen des Projekts, die ihren damaligen Funktionsumfang und ihre damaligen Daten haben.</p> <blockquote> <p>Willi ist mittlerweile in der 9c, aber wenn Du Kurse vom letzten Schuljahr abfragst, war er noch in der 8c. Du kannst auch nicht einfach 1 abziehen, weil Willi ja nicht in der 9c sein <strong>muss</strong>. Er kann auch sitzen geblieben oder gesprungen sein.</p> </blockquote> <p>Dafür müsste ich im Archiv das jeweilige Projekt öffnen.</p> <blockquote> <p>Was soll die Query eigentlich liefern?</p> </blockquote> <p>Sie soll alle gebuchten SuS eines bestimmten Nachschreibetermins ermitteln. Dazu muss ich wissen, in welchem Kurs (also Fach und unterrichtende Lehrkräfte) eine versäumte Klassenarbeit nachgeschrieben werden soll. Damit der Kurs einen vernünftigen Bezeichner bekommt, möchte ich nicht nur den Namen des Fachs, sondern auch die betroffenen Klassen ermitteln, sowie die tatsächlichen Unterrichtsstunden (lessons) wegen der zugeordneten KuK, damit da z.B. <em>7acd Rev Xyz/Abc</em> stehen kann (lies: evangelische Religionslehre unterrichtet von Xyz und Abc).</p> <blockquote> <p>Prüfungen ab dem 22.9.19 und die zugehörigen Schüler, und zwar für Kurse, wo ein Lehrer mit leerem user-login existiert. Für den geprüften Kurs noch das letzte Subject vor dem Prüfungsdatum - hä?</p> </blockquote> <p>Die Nachschreibetermine sind über das gesamte Schuljahr verteilt. Wie schon beschrieben ist mit veränderten Stundenplänen und daher anders zusammengesetzten Kursen zu rechnen. Deshalb muss ich für das spezielle Datum des Nachschreibetermins die dafür aktuell geltenden Kurse ermitteln, um für die betroffenen KuK und SuS die richtigen Bezeichner definieren zu können.</p> <p>Der leere User hätte auch irgend einen Dummy-Wert haben können. Der Admin-Zugang ist keiner Lehrkraft zugeordnet und hat selbst deswegen keinen eigenen Unterricht. Er hat aber übergeordnete Rechte und darf daher bei allen Unterrichten lesen und buchen.</p> <blockquote> <p>Wofür steht eine Row in einem Kurs, und was für ein Datum ist schedule?</p> </blockquote> <p>Das Datum bezeichnet den Starttag, ab dem der Stundenplan (schedule) gilt. Neuere Stundenpläne ersetzen ältere.<br> Eine Row enthält alle notwendigen Daten für einen Kurs, der für diesen Nachschreibetermin gilt.</p> <blockquote> <p>Was ist das subject eines Kurses? Deutsch? Oder "Gedichtinterpretation" - das hätte ich aber eher an der Lesson vermutet.</p> </blockquote> <p>Das <em>subject</em> ist das Fach, das im Zeugnis wieder erscheint und dem dort eine Schulnote zugeordnet ist. Also ja, so etwas wie "Deutsch". Das Thema der nachzuschreibenden Arbeit wird in den Kursdaten nicht festgehalten, auch nicht in den Buchungsdaten. Daher ist "Gedichtinterpretation" ein Unterrichtsinhalt, der in den Daten hier nicht vorkommen kann.</p> <p>In der Tabelle <code>lessons</code> steht, welcher Kurs zu welchem Zeitpunkt in welchen Räumen bei welchen Lehrkräften Unterricht hat. Dadurch ermittle ich, welche Lehrkräfte für die gebuchte Nachschreibearbeit infrage kommen.</p> <blockquote> <p>Ich bin auch nicht sicher, dass Du den DISTINCT bei dieser Subquery brauchst, du suchst doch den Kurseintrag mit dem höchsten Schedule-Wert vor der Prüfung, und da gibt's doch vermutlich nur einen, oder? Ich hab ja keine Ahnung was Du in courses genau drin hast </p> </blockquote> <p>Viele Kursbezeichnungen bleiben über die Stundenplanversionen hin konstant. Suchte ich also nach der Kursbezeichnung, würde die Query mehrere Treffer finden. Ich überlege gerade, inwiefern Dein Einwand vielleicht meine Buchungsdaten dahingehend verändern sollte, dass ich den relevanten Stundenplan für die Buchung mit speichere und nicht schlicht darauf vertraue, dass der jeweils neueste am Tag des Nachschreibetermins gilt. Manchmal sind KuK dazu gezwungen, Nachschreibearbeiten weit in die Zukunft zu buchen, da vorher keine geeigneten Termine sind. Bis dahin kann sich der Stundenplan aber wieder geändert haben.</p> <p>Danke für diesen Denkanstoß!</p> <blockquote> <p>Das sieht nach einem SEHR ungewöhnlichen fachlichen Szenario aus. Wenn Du hier Hilfestellung bei einer besseren Query willst, müsstest Du etwas mehr davon erzählen. Das mag dann aber zu viel über eure Schulinterna enthalten.</p> </blockquote> <p>Ich kann die Funktionalität erläutern. Kein Problem. Das ist weder etwas geheimes, noch intimes. Nur echte Daten darf ich natürlich nicht preisgeben.</p> <blockquote> <p>Es sieht jedenfalls danach aus, als ob die Lehrer ohne Login der Kern der Sache sind.</p> </blockquote> <p>Das ist ein Missverständnis. Der Admin-Zugang hat Zugriff auf die kompletten Listen. Da entsteht der Performance-Verlust. Bei jeder anderen Lehrkraft ist die Ergebnismenge wesentlich kleiner (erfahrungsgemäß 0-7), so dass man dort kein Performance-Problem hat. Dort steht dann auch nicht <code>AND 1=1</code> sondern <code>AND 1=0</code>, was einen gültigen Loginnamen zwingend notwenig macht, wenn da Ergebnisse kommen sollen.</p> <blockquote> <p>Oder gehört da eigentlich eine konkrete Login-ID hin und du hast sie weganonymisiert?</p> </blockquote> <p>Ja, so in etwa.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 20:36:29 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766171#m1766171 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766171#m1766171 <p>Hallo Felix,</p> <p>so langsam wird das Thema unübersichtlich...</p> <p>Soweit in der Query erkennbar, hast Du also einmal die users mit der Spezialisierung staff, und zum anderen die people mit Spezialisierung students, parents und guardians - aber auch die Lehrer. Ist also users eine Spezialisierung von people? Demnach ist also "student", "parent", "guardian" oder "teacher" eine <strong>Rolle</strong>, die ein Mensch aus people haben kann, und Rollen finden sind typischerweise in m:n Beziehungstabellen wieder. Dein Modell sieht da richtig aus. Was mir quer sitzt, ist users. Zur Zeit sind nur Lehrer User, aber Du willst ja erweitern können. Demnach ist potenziell jeder in people ein User, und der Login gehört dorthin. Es sei denn, du definierst "user" als weitere Rolle, die ein Mensch haben kann - aber da wäre ich pragmatisch.</p> <p>Anderer Punkt. Ich verstehe Dich so, dass Deine Exists Abfrage die Aufgabe hat, bei Nichtadmins die Berechtigung zu begrenzen. Lehrer sehen die Nachschreibeliste nur für die Kurse, die sie unterrichten. Und Admins sehen alles. In dem Fall ist es aber doch so, dass Du den ganzen Exists-Rattenschwanz nur für eine Lehrer-Query brauchst, und für eine Admin-Query gar nicht (weil es doch zu erwarten ist, dass für jeden Kurs, in dem nachgeschrieben wird, einen Lehrer gibt).</p> <p>Wenn also mit 1=1 tricksen, dann so (direkte Werteinjektion ins SQL angenommen):</p> <p><code>AND (1=$admin OR EXISTS(SELECT ....))</code></p> <p>Die Klammern sind wichtig. Siehe nächsten Absatz. Effizienter sollte es aber sein, den AND EXISTS Rattenschwanz nur für Lehrer-Queries ans SQL zu hängen und für Admins komplett wegzulassen. Den 1=1 Trick macht man eigentlich nur, wenn man auf statisches SQL angewiesen ist. Das ist bei PHP nicht der Fall.</p> <p>Deine Implementierung des 1=1 Tricks scheint mir ohnehin falsch. AND bindet stärker als OR, d.h. für Admins bist Du im EXISTS komplett ohne WHERE Bedingung unterwegs.</p> <p>Du könntest für Lehrerabfragen auch zunächst einmal den shorthand-Wert des betreffenden Lehrers ermitteln und den als Parameterwert in die Query geben, das eliminiert 2 JOINs. Trotzdem musst Du wieder mit dem SELECT MAX ran, weil ja lessons wie courses den Schedule benutzen. Und das k*tzt mich so richtig an.</p> <p>Das Grundgerüst der Query ist doch: Ein Schüler S schreibt am Termin X (alt_exam) im Fach Y (course) eine Nachprüfung. Die Beziehung zwischen den dreien wird durch alt_bookings repräsentiert. Am Kurs hängt das Stundenplandatum, ab dem dieser Kurs so gehalten wird. Und das sollte genau einer sein. Das hatte ich schonmal im Zusammenhang mit DISTINCT angesprochen, und du meintest, der Kursname wäre mehrfach da - aber doch nicht zu einem schedule-Datum, oder?</p> <p>Deswegen sollte man mit dieser Query doch pro Nachprüfungstermin den dort nachgeprüften Kurs bekommen (einmal pro Schüler).</p> <pre><code class="block">SELECT x.alt_exam, x.date, b.student, p.*, s.form, c.subject FROM alt_exams X JOIN alt_bookings B ON X.alt_exam = B.alt_exam JOIN courses C ON C.course_name = B.course_name AND C.schedule = (SELECT MAX(c2.schedule) FROM courses c2 WHERE c2.schedule <= x.date) JOIN students s ON S.student = B.student JOIN people p ON ... </code></pre> <p>Bis auf Rechteprüfung und Lehrerliste sollte das vollständig und richtig sein. Interessant ist, dass wir jetzt den schedule zum Kurs in der Ergebnismenge haben (wenn auch nicht anzeigen). Du kannst also c.schedule als Input für den Subselect mit dem GROUP_CONCAT verwenden und brauchst da keinen neuen SELECT MAX. Das gleiche gilt für die Rechteprüfung, du kannst auch dort die Lessons mit c.schedule heraussuchen, ohne einen neuen SELECT MAX zu machen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 20:46:01 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766174#m1766174 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766174#m1766174 <p>Schade eigentlich, dass Zitat 2527 unvollständig war und nun Minuspunkte erntet. In der vollständigen Form</p> <blockquote> <blockquote> <p>Denormalisierung ist oft die Schmiere im DB Getriebe.</p> </blockquote> </blockquote> <blockquote> <p>So wahr mir Codd helfe.</p> </blockquote> <p>wäre es vermutlich besser angekommen. Ich habe herzlich gelacht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Tue, 03 Mar 20 06:45:55 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766237#m1766237 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766237#m1766237 <blockquote> <p>ja, die Normalisierung habe ich so hoch umgesetzt, wie es mir möglich war.</p> </blockquote> <p>Mehrere <code>Distinct</code> in Deinen Abfragen deuten eher darauf hin, daß Deine Tabellen nicht normalisiert sind.</p> <p>MFG</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Mon, 02 Mar 20 06:55:59 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766182#m1766182 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766182#m1766182 <p>Lieber Rolf,</p> <p>ganz herzlichen Dank für Deine ausführliche Beschäftigung mit meinem Problem!</p> <p>Du nanntest die Idee der Denormalisierung. Da kann ich aus meiner Überzeugung tatsächlich ein Stück von annehmen, nämlich eine Art Caching der Kursbezeichnungen. Die werden für jeden Kurs pro Stundenplan als Eigenschaft <code>display_name</code> in die Tabelle <code>courses</code> eingetragen werden (muss ich noch implementieren). Dann kann ich alles diesbezügliche aus der Query weg lassen. Das hilft mir auch an anderen Stellen in meinem Projekt wieder weiter.</p> <blockquote> <p>so langsam wird das Thema unübersichtlich...</p> </blockquote> <p>Hehe, welcome to my world. Schule ist im Prinzip schon recht unübersichtlich. Aber schön, dass Du da schon so weit durchsteigst, dass Du mir sagen kannst, was ich verbessern kann!</p> <blockquote> <p>Soweit in der Query erkennbar, hast Du also einmal die users mit der Spezialisierung staff, und zum anderen die people mit Spezialisierung students, parents und guardians - aber auch die Lehrer. Ist also users eine Spezialisierung von people?</p> </blockquote> <p>So habe ich noch nie darüber nachgedacht, aber ja, Deine Formulierung stimmt. Die Tabellen <code>people</code> und <code>users</code> haben eine Spalte <code>person</code> gemeinsam.</p> <blockquote> <p>Demnach ist also "student", "parent", "guardian" oder "teacher" eine <strong>Rolle</strong>, die ein Mensch aus people haben kann, und Rollen finden sind typischerweise in m:n Beziehungstabellen wieder. Dein Modell sieht da richtig aus.</p> </blockquote> <p>Juhu! Ein Lob! Für einen DB-Noob! 8-]</p> <blockquote> <p>Was mir quer sitzt, ist users. Zur Zeit sind nur Lehrer User, aber Du willst ja erweitern können. Demnach ist potenziell jeder in people ein User, und der Login gehört dorthin. Es sei denn, du definierst "user" als weitere Rolle, die ein Mensch haben kann - aber da wäre ich pragmatisch.</p> </blockquote> <p>Ich habe in einer anderen Tabelle <code>user_privileges</code> definiert, was ein bestimmter User tun darf und was nicht. Hier haben die Tabellen die Spalte <code>login</code> gemeinsam. Natürlich könnte die auch eine Eigenschaft von <code>people</code> sein, aber dort stehen im Grunde die Dinge wie Name, Nachname, Anschrift, E-Mail usw.</p> <blockquote> <p>Anderer Punkt. Ich verstehe Dich so, dass Deine Exists Abfrage die Aufgabe hat, bei Nichtadmins die Berechtigung zu begrenzen. Lehrer sehen die Nachschreibeliste nur für die Kurse, die sie unterrichten. Und Admins sehen alles.</p> </blockquote> <p>Korrekt.</p> <blockquote> <p>In dem Fall ist es aber doch so, dass Du den ganzen Exists-Rattenschwanz nur für eine Lehrer-Query brauchst, und für eine Admin-Query gar nicht (weil es doch zu erwarten ist, dass für jeden Kurs, in dem nachgeschrieben wird, einen Lehrer gibt).</p> </blockquote> <p>Du meinst, ich sollte den SQL-Code dynamischer zusammenstellen?</p> <blockquote> <p>Wenn also mit 1=1 tricksen, dann so (direkte Werteinjektion ins SQL angenommen):</p> <p><code>AND (1=$admin OR EXISTS(SELECT ....))</code></p> </blockquote> <p>Ist meine aktuelle Schreibweise so, dass damit unnötige Datenermittlung ausgelöst wird? Das wäre eine echte Performance-Bremse.</p> <blockquote> <p>Die Klammern sind wichtig. Siehe nächsten Absatz. Effizienter sollte es aber sein, den AND EXISTS Rattenschwanz nur für Lehrer-Queries ans SQL zu hängen und für Admins komplett wegzulassen. Den 1=1 Trick macht man eigentlich nur, wenn man auf statisches SQL angewiesen ist. Das ist bei PHP nicht der Fall.</p> </blockquote> <p>OK. Also kein Monster-SQL, um es bequem mit passenden Parametern zu füllen, sondern direkt zwei maßgeschneiderte SQL-Statements für die beiden Fälle bereithalten.</p> <blockquote> <p>Deine Implementierung des 1=1 Tricks scheint mir ohnehin falsch. AND bindet stärker als OR, d.h. für Admins bist Du im EXISTS komplett ohne WHERE Bedingung unterwegs.</p> </blockquote> <p>Also wäre es besser, das EXISTS würde bei Admins komplett fehlen.</p> <p>Übrigens: Die Admins-Eigenschaft kann für speziell diese Aufgabe vergeben werden. Die Lehrkraft, die den Nachschreibetermin organisiert, ist für diesen Teil des Projekts mit diesem Privileg ausgerüstet, damit sie Zugriff auf alle Buchungen hat, um auch bei anderen Kursen buchen oder stornieren zu können.</p> <blockquote> <p>Du könntest für Lehrerabfragen auch zunächst einmal den shorthand-Wert des betreffenden Lehrers ermitteln und den als Parameterwert in die Query geben, das eliminiert 2 JOINs.</p> </blockquote> <p>Der prinzipielle Admin-Account hat kein Lehrerkürzel, weil er kein Lehrer ist. Daher könnte es einen User geben, der hier Admin-Privileg hat, aber eben kein Lehrerkürzel und damit keinen eigenen Unterricht.</p> <blockquote> <p>Trotzdem musst Du wieder mit dem SELECT MAX ran, weil ja lessons wie courses den Schedule benutzen. Und das k*tzt mich so richtig an.</p> </blockquote> <p>Hehe, mich auch! Aber hier habe ich schon etwas nachgedacht: Bei der Buchung werde ich jetzt den aktuell gültigen <code>schedule</code> mit speichern, damit klar wird, aus welchem Stundenplan die Nachschreibearbeit entstanden ist. Es könnte ja sein, dass ein Unterricht nur im ersten Halbjahr stattfindet und der Nachschreiber erst im zweiten Halbjahr einen Buchungsplatz bekommt. Bisher geht mein Programm davon aus, dass der Unterricht zur Zeit des Buchungstermins stattfindet und deshalb der aktuellst mögliche <code>schedule</code> angenommen werden muss. Und daher kommt das SELECT MAX. Und mit dem Speichern des relevanten <code>schedule</code>-Wertes könnte das entfallen.</p> <blockquote> <p>Das Grundgerüst der Query ist doch: Ein Schüler S schreibt am Termin X (alt_exam) im Fach Y (course) eine Nachprüfung. Die Beziehung zwischen den dreien wird durch alt_bookings repräsentiert.</p> </blockquote> <p>Genau.</p> <blockquote> <p>Am Kurs hängt das Stundenplandatum, ab dem dieser Kurs so gehalten wird. Und das sollte genau einer sein. Das hatte ich schonmal im Zusammenhang mit DISTINCT angesprochen, und du meintest, der Kursname wäre mehrfach da - aber doch nicht zu einem schedule-Datum, oder?</p> </blockquote> <p>Beides ist richtig. Die Spalten <code>course_name</code> und <code>schedule</code> sind zusammen der Primärschlüssel der Tabelle <code>courses</code>. Mit meiner Idee, den relevanten <code>schedule</code>-Wert in die <code>alt_bookings</code>-Tabelle aufzunehmen, hätten wir das Problem gelöst und die Normalisierung nicht einmal verletzt.</p> <blockquote> <p>Deswegen sollte man mit dieser Query doch pro Nachprüfungstermin den dort nachgeprüften Kurs bekommen (einmal pro Schüler).</p> <pre><code class="block">SELECT x.alt_exam, x.date, b.student, p.*, s.form, c.subject FROM alt_exams X JOIN alt_bookings B ON X.alt_exam = B.alt_exam JOIN courses C ON C.course_name = B.course_name AND C.schedule = (SELECT MAX(c2.schedule) FROM courses c2 WHERE c2.schedule <= x.date) JOIN students s ON S.student = B.student JOIN people p ON ... </code></pre> </blockquote> <p>Das muss ich mir genauer anschauen. Das braucht aber Zeit.</p> <blockquote> <p>Bis auf Rechteprüfung und Lehrerliste sollte das vollständig und richtig sein. Interessant ist, dass wir jetzt den schedule zum Kurs in der Ergebnismenge haben (wenn auch nicht anzeigen). Du kannst also c.schedule als Input für den Subselect mit dem GROUP_CONCAT verwenden und brauchst da keinen neuen SELECT MAX. Das gleiche gilt für die Rechteprüfung, du kannst auch dort die Lessons mit c.schedule heraussuchen, ohne einen neuen SELECT MAX zu machen.</p> </blockquote> <p>Da habe ich also die wichtigste Optimierungsmöglichkeit! Prima! Das werde ich genauer anschauen und prüfen, wo ich noch so Mist baue.</p> <p>Noch einmal ganz herzlichen Dank!</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Wed, 04 Mar 20 20:16:52 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766389#m1766389 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766389#m1766389 <p>Lieber Rolf,</p> <blockquote> <p>Interessant ist, dass wir jetzt den schedule zum Kurs in der Ergebnismenge haben (wenn auch nicht anzeigen). Du kannst also c.schedule als Input für den Subselect mit dem GROUP_CONCAT verwenden und brauchst da keinen neuen SELECT MAX. Das gleiche gilt für die Rechteprüfung, du kannst auch dort die Lessons mit c.schedule heraussuchen, ohne einen neuen SELECT MAX zu machen.</p> </blockquote> <p>Da haben wir den Casus Knaxus. Die Query habe ich nun so gestaltet, wie Du sie beschrieben hast und die Performance hat sich gewaltig gesteigert.</p> <p>Hurra!!!</p> <p>Herzlichsten Dank und liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 21:19:48 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766177#m1766177 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766177#m1766177 <p>Hallo Rolf,</p> <blockquote> <blockquote> <blockquote> <p>Denormalisierung ist oft die Schmiere im DB Getriebe.</p> </blockquote> </blockquote> <blockquote> <p>So wahr mir Codd helfe.</p> </blockquote> <p>wäre es vermutlich besser angekommen. Ich habe herzlich gelacht.</p> </blockquote> <p>ich nicht, weil ich keinen blassen Schimmer habe, wer oder was mit Codd gemeint ist. Die Stelle zum Lachen erschließt sich mir daher nicht.<br> Ich kenne wohl cod (Kabeljau), aber der ist hier sicher nicht gemeint.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Mon, 02 Mar 20 23:29:57 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766233#m1766233 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766233#m1766233 <p>Aloha ;)</p> <blockquote> <p>Schade eigentlich, dass Zitat 2527 unvollständig war und nun Minuspunkte erntet.</p> </blockquote> <p>Ich hab mal meine Adminrechte <s>mis</s>gebraucht um das Zitat zu vervollständigen. Vielleicht ändert ja der eine oder andere seine Bewertung dann nochmal.</p> <p>Grüße,</p> <p>RIDER</p> <div class="signature">-- <br> Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller<br> # <a href="https://twitter.com/Camping_RIDER" rel="nofollow noopener noreferrer">Twitter</a> # <a href="http://steamcommunity.com/id/Camping_RIDER" rel="nofollow noopener noreferrer">Steam</a> # <a href="https://www.youtube.com/user/RidersFlame" rel="nofollow noopener noreferrer">YouTube</a> # <a href="http://wiki.selfhtml.org/wiki/Benutzer:Camping_RIDER" rel="nofollow noopener noreferrer">Self-Wiki</a> # <a href="http://community.de.selfhtml.org/fanprojekte/selfcode.htm" rel="nofollow noopener noreferrer">Selfcode</a>: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[ </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 22:27:30 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766180#m1766180 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766180#m1766180 <p>Hallo Der Martin,</p> <blockquote> <blockquote> <blockquote> <blockquote> <p>Denormalisierung ist oft die Schmiere im DB Getriebe.</p> </blockquote> </blockquote> <blockquote> <p>So wahr mir Codd helfe.</p> </blockquote> </blockquote> </blockquote> <blockquote> <p>weil ich keinen blassen Schimmer habe, wer oder was mit Codd gemeint ist.</p> </blockquote> <p><a href="https://de.m.wikipedia.org/wiki/Edgar_F._Codd" rel="nofollow noopener noreferrer">https://de.m.wikipedia.org/wiki/Edgar_F._Codd</a></p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 01 Mar 20 22:32:08 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766181#m1766181 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766181#m1766181 <p>n'Abend,</p> <blockquote> <blockquote> <blockquote> <blockquote> <blockquote> <p>Denormalisierung ist oft die Schmiere im DB Getriebe.</p> </blockquote> </blockquote> <blockquote> <p>So wahr mir Codd helfe.</p> </blockquote> </blockquote> </blockquote> <blockquote> <p>weil ich keinen blassen Schimmer habe, wer oder was mit Codd gemeint ist.</p> </blockquote> <p><a href="https://de.wikipedia.org/wiki/Edgar_F._Codd" rel="nofollow noopener noreferrer">https://de.wikipedia.org/wiki/Edgar_F._Codd</a></p> </blockquote> <p>danke, von dem habe ich tatsächlich noch nie gehört. Deswegen war ich mir auch nicht einmal sicher, ob eine Person, ein Unternehmen, ein geographischer oder psychologischer Begriff gemeint sein könnte.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Ich stamme aus Ironien, einem Land am sarkastischen Ozean. </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Mon, 02 Mar 20 07:25:32 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766185#m1766185 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766185#m1766185 <p>Hallo Felix,</p> <p>eine ausführliche Antwort wird mir gerade zu viel...</p> <p>Für einen Noob machst du jedenfalls recht erfolgreich recht komplexe Dinge </p> <blockquote> <p>Bei der Buchung werde ich jetzt den aktuell gültigen schedule mit speichern, damit klar wird, aus welchem Stundenplan die Nachschreibearbeit entstanden ist</p> </blockquote> <p>Dem kann ich jetzt nicht folgen, vor allem dem Nachschreiben im nächsten Halbjahr nicht. Der course_name ist doch im Schuljahr eindeutig, oder? "Deutsch 6c" oder "Ethik Q1b" (Annahme: in der Q1 gibt es 2 Ethik-Kurse). Wird Ethik nur im 1. Halbjahr unterrichtet, würde die SELECT MAX Query doch auch im 2. HJ noch den letzten gültigen Schedule des 1. HJ finden. Bucht aber Herr Müller im November einen Ethik Nachschreibetermin im März für Schüler Willi, und geht im Dezember in Rente, willst du ihn ja nicht als Aufsicht im März haben, sondern seine Nachfolgerin Frau Meier.</p> <p>Ich habe den Subselect für die Lehrerliste nicht ganz durchschaut. Würde der Herrn Müller und Frau Meier liefern, wenn du an der Buchung den Stundenplan speicherst?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Tue, 03 Mar 20 19:02:31 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766323#m1766323 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766323#m1766323 <p>Hallo pl,</p> <blockquote> <blockquote> <p>ja, die Normalisierung habe ich so hoch umgesetzt, wie es mir möglich war.</p> </blockquote> <p>Mehrere <code>Distinct</code> in Deinen Abfragen deuten eher darauf hin, daß Deine Tabellen nicht normalisiert sind.</p> </blockquote> <p>Begründung bitte.</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Tue, 03 Mar 20 20:23:04 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766331#m1766331 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766331#m1766331 <p>Lieber TS,</p> <p>ich habe keine Ahnung, welche Seriennummern die im Server verbauten Prozessoren oder Speicherriegel haben. Das kümmert mich als Kunden auch nicht. Was mich kümmert, ist die Umständlichkeit meiner Queries. Da ist sehr viel Optimierungspotenzial, ohne Wissen um die Nennspannung auf dem LAN-Kabel, die UEFI-Versionsnummer oder die Größe des L3-Caches.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Tue, 03 Mar 20 20:35:02 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766334#m1766334 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766334#m1766334 <p>Lieber Felix,</p> <blockquote> <p>ich habe keine Ahnung, welche Seriennummern die im Server verbauten Prozessoren oder Speicherriegel haben. Das kümmert mich als Kunden auch nicht. Was mich kümmert, ist die Umständlichkeit meiner Queries. Da ist sehr viel Optimierungspotenzial, ohne Wissen um die Nennspannung auf dem LAN-Kabel, die UEFI-Versionsnummer oder die Größe des L3-Caches.</p> </blockquote> <p>Denkwürdige Einstellung. Du hast nach Performance gefragt und nun bringst Du hier Dinge ins Spiel, die ich wirklich als unsachlich empfinde :-O</p> <p>Aber wenn Du weiter Äpfel mit Würstchenwasser vergleichen willst, dann passt das wohl.</p> <p>Glück Auf und gute Nacht<br> Tom mobil</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 08 Mar 20 09:58:03 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766548#m1766548 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766548#m1766548 <p>Lieber Tom,</p> <blockquote> <p>Denkwürdige Einstellung. Du hast nach Performance gefragt und nun bringst Du hier Dinge ins Spiel, die ich wirklich als unsachlich empfinde :-O</p> </blockquote> <p>ich fand Deine Nachfrage wirklich sehr daneben. Folgende Gründe:</p> <ol> <li>Offensichtlich habe ich eine Erwartungshaltung, dass die Performance eigentlich ähnlich sein sollte.</li> <li>Meine Erwartungshaltung hat einen Grund, nämlich den, dass es in anderen Zusammenhängen eine gleiche oder ähnliche Performance gibt.</li> <li>Das Problem muss mit Software (allein!) zu tun haben. Offensichtlich ist meine Query optimierbar, daher habe ich sie gepostet.</li> <li>Du kommst mit Hardware-Fragen, die mit Software überhaupt nichts zu tun haben.</li> </ol> <blockquote> <p>Aber wenn Du weiter Äpfel mit Würstchenwasser vergleichen willst, dann passt das wohl.</p> </blockquote> <p>Genau. Und bitte das Abfalldatum auf den Äpfeln berücksichtigen! ;-)</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 08 Mar 20 13:42:31 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766569#m1766569 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766569#m1766569 <p>Jetzt habe ich gerade 10 Minuten an einer Antwort auf</p> <p>https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766568#m1766568</p> <p>rumgetippt... Absenden gedrückt... "Zugriff verboten".</p> <p>Frustierend. Naja. Schönen Sonntag noch.</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Wed, 04 Mar 20 20:23:22 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766391#m1766391 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766391#m1766391 <p>Hallo Felix,</p> <p>na, da haben sich 35 Jahre Berufserfahrung ja doch mal gelohnt :D</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 08 Mar 20 10:03:35 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766550#m1766550 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766550#m1766550 <p>Hello,</p> <blockquote> <p>Lieber Tom,</p> <blockquote> <p>Denkwürdige Einstellung. Du hast nach Performance gefragt und nun bringst Du hier Dinge ins Spiel, die ich wirklich als unsachlich empfinde :-O</p> </blockquote> <p>ich fand Deine Nachfrage wirklich sehr daneben. Folgende Gründe:</p> <ol> <li>Offensichtlich habe ich eine Erwartungshaltung, dass die Performance eigentlich ähnlich sein sollte.</li> <li>Meine Erwartungshaltung hat einen Grund, nämlich den, dass es in anderen Zusammenhängen eine gleiche oder ähnliche Performance gibt.</li> <li>Das Problem muss mit Software (allein!) zu tun haben. Offensichtlich ist meine Query optimierbar, daher habe ich sie gepostet.</li> <li>Du kommst mit Hardware-Fragen, die mit Software überhaupt nichts zu tun haben.</li> </ol> <blockquote> <p>Aber wenn Du weiter Äpfel mit Würstchenwasser vergleichen willst, dann passt das wohl.</p> </blockquote> </blockquote> <p>Ich hatte verstanden, dass Du die gleiche Abfrage auf zwei unterschiedlichen Systemen durchführst und nun nach dem Grund für unterschiedliche Antwortzeiten suchst.</p> <p>Habe ich Dich da verkehrt verstanden?</p> <p>Glück Auf<br> Tom vom Berg</p> <div class="signature">-- <br> Es gibt nichts Gutes, außer man tut es!<br> Das Leben selbst ist der Sinn. </div> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 08 Mar 20 12:40:20 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766556#m1766556 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766556#m1766556 <blockquote> <p>ich fand Deine Nachfrage wirklich sehr daneben.</p> </blockquote> <p>So ging es mir mit Deiner Antwort auf Toms Anregungen auch. Christian Kruse hat in diesem Thread ähnliche Fragen in den Raum geworfen - völlig zu Recht. Die hast Du aber nicht in der Luft zerrissen. Warum eigentlich?</p> <p>Stattdessen redest Du jetzt von Erwartungshaltungen und Software, mit der es zu tun haben <em>muss</em>, ohne dass Du das überhaupt fachlich greifen kannst.</p> <p>Schönen Tach!</p> Extreme Performance-Unterschiede zwischen MariaDB und MySQL? Sun, 08 Mar 20 13:22:05 Z https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766567#m1766567 https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766567#m1766567 <p>Lieber Mitleser,</p> <p>ich habe auf Christians Frage am 1.3. mit allen nachgefragten Details geantwortet. Seit diesem Zeitpunkt sollte in der Diskussion die Hardware als primäre Ursache sicher auszuschließen gewesen sein - insbesondere als klar werden musste, <a href="https://forum.selfhtml.org/self/2020/mar/01/extreme-performance-unterschiede-zwischen-mariadb-und-mysql/1766140#m1766140" rel="noopener noreferrer">dass das Caching auf meinem Testsystem diesen enormen Performanceunterschied verursachte</a> (auch noch am 1.3.). Und nun kommt Tom am 3.3. mit Hardware-Fragen, die diese miese Performance auf inzwischen (Stand spät am 1.3.) beiden Systemen nicht einmal im Ansatz erklären konnten.</p> <p>Da fühlte ich mich ... nunja, sagen wir mal: im falschen Film.</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p>