jaka jest domyślna kolejność rekordów dla instrukcji select w mysql?
<p>załóżmy, że masz następującą tabelę i dane:</p><pre><code>create table t ( k int, v int, index k(k) ) engine=memory; insert into t (k, v) values (10, 1), (10, 2), (10, 3); </code></pre><p>wydając <code>select * from t where k = 10</code> z nie <code>order by</code> klauzula, w jaki sposób mysql domyślnie sortuje rekordy?</p>
<p>przekazanie <a href="https://dba.stackexchange.com/questions/5774/why-is-ssms-inserting-new-rows-at-the-top-of-a-table-not-the-bottom/5775#5775">moja odpowiedź</a> na podobne pytanie dotyczące programu sql server:</p><blockquote> <p>w świecie sql porządek nie jest nieodłączną właściwością zestawu danych. w ten sposób nie otrzymujesz żadnych gwarancji z rdbms, że twoje dane wrócą w określonej kolejności - lub nawet w spójnej kolejności - chyba że zapytasz o swoje dane klauzulą ​​order by.</p> </blockquote><p>tak więc, aby odpowiedzieć na twoje pytanie:</p><ul> <li>mysql sortuje rekordy, jak chce, bez żadnej gwarancji spójności.</li> <li>jeśli zamierzasz cokolwiek polegać na tym zamówieniu, <strong> musisz określić żądane zamówienie za pomocą <code>order by</code>. robienie czegokolwiek innego to przygotowywanie się na niepożądane niespodzianki. </strong></li> </ul><p>jest to właściwość całego sql, nie tylko mysql. odpowiedni tekst w <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt">specyfikacja sql-92</a> to:</p><blockquote> <p>jeśli nie podano &lt;kolejność według klauzuli&gt;, kolejność wierszy q zależy od implementacji.</p> </blockquote><p>w specyfikacji kursorów znajdują się podobne fragmenty tekstu.</p>
Z ograniczeniem, że klauzula warunek może być „coś”, to jesteś ograniczony do skanowania całą listę i stosując warunek.


Jeśli istnieją ograniczenia dotyczące klauzuli stan, wtedy można spojrzeć na organizowanie danych do bardziej efektywnie obsługiwać zapytań.


Na przykład, przykładowy kod z „byFirstLetter” słowniku nie pomaga w ogóle z „endswith” zapytania.


Więc tak naprawdę sprowadza się do tego, co pyta chcesz zrobić przed tymi danymi.


W bazach danych, problem ten jest ciężar „optymalizator zapytań”. W typowej bazy danych, jeśli masz bazę danych bez indeksów, oczywiście każde zapytanie będzie skan tabeli. Jak dodać indeksów w tabeli, optymalizator może użyć tych danych do bardziej wyrafinowanych zapytań planuje lepiej dostać się do danych. To w istocie problem, który opisujesz.


Gdy masz bardziej konkretny podzbiór typów kwerend następnie można zrobić lepszą decyzję, co struktura jest najlepsza. Ponadto, należy wziąć pod uwagę ilość danych. Jeśli masz listę 10 elementów każdy mniej niż 100 bajtów, skan wszystko może okazać się najszybciej, co można zrobić, ponieważ masz taką małą ilość danych. Oczywiście, że nie skaluje się do elementów 1M, ale nawet sprytnych technik dostępu nosić koszt w instalacji, konserwacji (jak utrzymanie indeksu) i pamięć.


**EDIT** , na podstawie komentarza


Jeśli jest to auto Nieukończenie, jeśli dane są statyczne, a następnie posortować je i używać przeszukiwanie binarne. Nie jesteś naprawdę dzieje się szybciej niż to.


Jeśli dane są dynamiczne, a następnie zapisać go w zrównoważonym drzewie, i szukać tego. To skutecznie wyszukiwanie binarne, a to pozwala zachować dodać dane losowo.


Coś jeszcze jest jakaś specjalność na tych pojęć. Jest to dość szerokie, ale dam ci tak ogólną odpowiedź, jak tylko mogę.

**CTE ...**

* Są niezindeksowalne (ale mogą używać istniejących indeksów na obiektach, do których istnieją odwołania)
* Nie można mieć ograniczeń
* Są zasadniczo jednorazowe `VIEW` s
* Trwać tylko do momentu uruchomienia następnego zapytania
* Może być rekurencyjny
* Nie masz dedykowanych statystyk (polegaj na statystykach dotyczących podstawowych obiektów)

**#Temp Tables ...**

* Są prawdziwe zmaterializowane tabele, które istnieją w tempdb
* Może być indeksowany
* Może mieć ograniczenia
* Trwaj w życiu obecnego POŁĄCZENIA
* Może odwoływać się do innych zapytań lub podprocedur
* Masz dedykowane statystyki generowane przez silnik

Jeśli chodzi o użycie każdego z nich, mają bardzo różne przypadki użycia.Jeśli masz bardzo duży zestaw wyników lub musisz odwołać się do niego więcej niż raz, umieść go w tabeli `#temp` .Jeśli ma być rekurencyjny, jednorazowy lub po prostu dla uproszczenia logicznego, preferowany jest `CTE` .

Ponadto należy `CTE`**nigdy nie używaj do wykonania**.Prawie nigdy nie przyspieszysz przy użyciu CTE, ponieważ znowu jest to widok jednorazowy.Możesz zrobić z nimi kilka fajnych rzeczy, ale przyspieszenie zapytania nie jest jednym z nich. ło panie. dobra. jeśli używasz entity framework, to wybierz wszystko, co jest w danej tabelce do zmiennej (i już masz dane 2 cache). sprawdzasz ile masz tam danych metodą count dostępną dla list. robisz tablicę dynamiczną i wrzucasz tam dane podzielone z listy. zwykły for od 0 do tego, ile zwróciło … druga pewnie jest dla sprawdzenia poprwanosci odpowiedzi, kucze nie pamietam dokladnie tych komend ale sprobuj skopjowac je z tej gotowej tabelki i ewentualnie cos pozmieniaj- a dokladniej t wspolrzedne pol zeby sie zgadzaly (wstaw tylko w pierwszych ramkach a reszte zlap za jeden rog i przeciagnij to ci sie skopiuje dla innych wynikow) <p>spróbuj tego:</p><pre><code>$query = new query; $query-&gt;select(['um.id as userid', 'um.first\_name', 'um.last\_name','um.email','count(g.id) as guestcount']) -&gt;from('user\_master um') -&gt;join('left join', 'guest g', 'g.user\_id = um.id') -&gt;limit(20) -&gt;offset(12) -&gt;groupby('um.id') -&gt;orderby(['um.id' =&gt; sort\_desc]); </code></pre><p><code>offset()</code> określa punkt początkowy, a <code>limit()</code> określa liczbę rekordów. jeśli chcesz zapisywać między <code>12</code> a <code>20</code>, użyj <code>limit(8)</code>.</p><p>po więcej informacji:</p><ul> <li> <a href="http://www.bsourcecode.com/yiiframework2/select-query-model/#offset">http://www.bsourcecode.com/yiiframework2/select-query-model/#offset</a> </li> <li> <a href="http://www.yiiframework.com/doc-2.0/yii-db-querytrait.html#offset%28%29-detail">http://www.yiiframework.com/doc-2.0/yii-db-querytrait.html#offset%28%29-detail</a> </li> </ul> ```
$lasteight = mysqli_real_escape_string($_POST['lasteight']);

mysqli_query($con, "
    UPDATE inv SET
        other = 'log_itm'
    WHERE
        RIGHT(item_id, 8) = '$lasteight'
");

// OR

mysqli_query($con, "
    UPDATE inv SET other = 'log_itm' WHERE item_id LIKE '%". $lasteight ."'
");

``` Można użyć `OCIDefineArrayOfStruct`obsługuje pobierania tablic rekordów. Można to zrobić poprzez przepuszczenie podstawę do tablicy `OCIDefineByPos`i używać `OCIDefineArrayOfStruct`powiedzieć Oracle o wielkości zapisów (skip rozmiaru). Wierzę, że wtedy zadzwonić `OCIFetch`informując go sprowadzić rozmiaru tablicy. 


Alternatywą jest ustawiony atrybut oświadczeniem `OCI_ATTR_PREFETCH_ROWS`, zanim zostanie wykonany. Mówi Oracle ile wierszy pobrać na raz, to domyślnie do 1. Stosując to podejście, Oracle sprawia mniej wycieczki okrągłe i buforuje wiersze dla Ciebie.


`OCIBindArrayOfStruct`jest używany z instrukcji DML. To działa w podobny sposób, aby `OCIDefineArrayOfStruct`oprócz tego, że pracuje ze zmiennymi bind.


Można znaleźć przykładowy kod na stronie Oracle. Niech najpierw wprowadzą listę słówek. Dajesz kursor na stronie od której chcesz zacząć i potem idziesz do Układ strony, znaki podziału, Następna strona i potem jak już to zaznaczysz to idziesz do Wstawianie i Numer strony a potem jeszcze raz do wstawianie, ale teraz wybierasz formatuj numery stron i dajesz 1 w tabelce, która wyskoczy w opcji Rozpocznij od. No i potem tylko ręcznie usuwasz numerki z pierwszych stron i tak będziesz z każdym zadaniem przychodzić tutaj? :stuck\_out\_tongue:

po każdej zmiennej powpisuj sobie czytelne komunikaty w print'ach z aktualną wartością zmiennej i będziesz wszystko wiedzieć jak program się wykonuje.

tutaj akurat masz pętlę while z warunkiem x < 5, i w niej zagnieżdżoną drugą…