Skocz do zawartości

[zabawa] Problem do rozwiązania.


krupek

Rekomendowane odpowiedzi

elo,

rozmawiając z pewną osobą na IRCu na #seo padł pewien problem do rozwiązania:

Silnik bazodanowy: najnowszy MySQL taki jaki jest na dev.mysql.com, typ MyISAM.

Mamy tabelę, która ma 1,000,000 rekordów i 100 kolumn, każda kolumna zawiera md5.

Problem:

Należy wybrać w jak najkrótszym czasie 1,000 losowych rekordów z możliwością powtórki.

Musi to być jedno zapytanie: select ... from lub call sp_...

[inaczej napisz skrypt sql-owy, który wyciągnie 1,000 losowych rekordów z powtórzeniami ;)]

Kto chętny do zabawy ?

pozdro 600

:)

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 49
  • Dodano
  • Ostatniej odpowiedzi

krupka zerkne na to po filmiku. Cos mi irc.warszawa zdechło.

Mysle ze ktos jak siedzi w mysqlu to pewnikiem zrobi to szybko.

Z ciekawosci sam zerkne.

Postaram sie nie uzywac standardowego rozwiazania Rand() tylko oprzec to o tego typu kod

<?php

function random_row($table, $column) {

$max_sql = "SELECT max(" . $column . ")

AS max_id

FROM " . $table;

$max_row = mysql_fetch_array(mysql_query($max_sql));

$random_number = mt_rand(1, $max_row['max_id']);

$random_sql = "SELECT * FROM " . $table . "

WHERE " . $column . " >= " . $random_number . "

ORDER BY " . $column . " ASC

LIMIT 1";

$random_row = mysql_fetch_row(mysql_query($random_sql));

if (!is_array($random_row)) {

$random_sql = "SELECT * FROM " . $table . "

WHERE " . $column . " < " . $random_number . "

ORDER BY " . $column . " DESC

LIMIT 1";

$random_row = mysql_fetch_row(mysql_query($random_sql));

}

return $random_row;

}

echo '<pre>';

print_r(random_row('mojatabela', 'moja_kolumna'));

echo '</pre>';

?>

Odnośnik do komentarza
Udostępnij na innych stronach

Uwaga w konkursie przewidziana nagroda, o wartości około 2 000 pln

Osoba, która poda najwydajniejszy algorytm otrzyma na 1msc 500k punktów w systemie e-weblink,

wyznaczane wg nowych zasad po 1 października przelane na konto, które poda.

Rozwiązania można przesyłać PW lub wklejać na forum.

Czas nadsyłania zadań do końca września.

Wynik będzie średnią czasu 100 zapytań testowana na 1 maszynie i tej samej maszynie.

Przykładowe bazy danych (małą 10k rekordów i dużą 1m rekordów) postaram się uploadnąć dzisiaj wieczorkiem.

Proszę tylko pamiętać o tym, że:

* każdy rekord może wystąpić n-razy,

* nie można w żaden sposób modyfikować tabeli, zapisywać nic do bazy.

pozdro 600

:P

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

krupka zerkne na to po filmiku. Cos mi irc.warszawa zdechło.

Mysle ze ktos jak siedzi w mysqlu to pewnikiem zrobi to szybko.

Z ciekawosci sam zerkne.

Postaram sie nie uzywac standardowego rozwiazania Rand() tylko oprzec to o tego typu kod

<?php

function random_row($table, $column) {}

echo '<pre>';

print_r(random_row('mojatabela', 'moja_kolumna'));

echo '</pre>';

?>

Ale nawaliłeś kodu :P

Robisz tutaj więcej niż jedno zapytanie.

blog o apple | highlab.pl - blog technologiczny

Odnośnik do komentarza
Udostępnij na innych stronach

Skrypt do generowania ścierwa testowego:

<?php
$cols = 1000;
$rows = 1000000;

$o = new PDO('mysql:dbname=krupek', root,'');
$o->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$o->query("DROP TABLE IF EXISTS krupek");
for($c = 1;$c<=$cols;$c++){
  $str[] = "col$c TEXT";
  $str2[] = "md5(rand())";
}

$query = 'CREATE TABLE krupek(' . implode(', ', $str) . ');';
$o->query($query);

for($row=1;$row<=$rows;$row++)
$sth = $o->query('INSERT INTO krupek VALUES(' . implode(', ', $str2) . ')');

?>

Krupka uprasza się o potwierdzenie zgodności generowanych danych z zasadami konkursu!

Odnośnik do komentarza
Udostępnij na innych stronach

@martynski: nie znam na tyle tego języka ale w skrócie sprowadza się to do:

create table zabawa (c1 char(32), c2 char(32), c3 char(32), ... c100 char(32));,

a potem

insert into zabawa values (md5(rand()), md5(rand()), md5(rand()), ... md5(rand()));

@oscid: ponieważ pw nie puszcza to klepnę tutaj: Twoja propo nie zwraca duplikatów.

pozdro 600

:D

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

Problem:

Należy wybrać w jak najkrótszym czasie 1,000 losowych rekordów z możliwością powtórki

Gdzie tu jest mowa o duplikatach? Z opisu wynika, że ma to być wyciągnięcie losowych 1000 rekordów,

z możliwością ponownego wyciągnięcia tych samych rekordów!

Odnośnik do komentarza
Udostępnij na innych stronach

Twoje rozwiązanie nie umożliwia wyciągnięcia duplikatów to 1)

2) w niektórych przypadkach nie zwróci 1000 rekordów.

podane wartości 10^6 rekordów, i losowych 10^3 służą zobrazowaniu problemu,

co w przypadku gdyby rekordów było 1001 i należałoby wyciągnąć 1000 razy losowy rekord?

pozdro 600

:D

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

skrypty do tworzenia tabelek: zabawam - mała tabelka, zabawad - duża tabelka

create table zabawam (k1 char(32),k2 char(32),k3 char(32),k4 char(32),k5 char(32),k6 char(32),k7 char(32),k8 char(32),k9 char(32),k10 char(32)) type MyISAM;

create table zabawad (k1 char(32),k2 char(32),k3 char(32),k4 char(32),k5 char(32),k6 char(32),k7 char(32),k8 char(32),k9 char(32),k10 char(32),k11 char(32),k12 char(32),k13 char(32),k14 char(32),k15 char(32),k16 char(32),k17 char(32),k18 char(32),k19 char(32),k20 char(32),k21 char(32),k22 char(32),k23 char(32),k24 char(32),k25 char(32),k26 char(32),k27 char(32),k28 char(32),k29 char(32),k30 char(32),k31 char(32),k32 char(32),k33 char(32),k34 char(32),k35 char(32),k36 char(32),k37 char(32),k38 char(32),k39 char(32),k40 char(32),k41 char(32),k42 char(32),k43 char(32),k44 char(32),k45 char(32),k46 char(32),k47 char(32),k48 char(32),k49 char(32),k50 char(32),k51 char(32),k52 char(32),k53 char(32),k54 char(32),k55 char(32),k56 char(32),k57 char(32),k58 char(32),k59 char(32),k60 char(32),k61 char(32),k62 char(32),k63 char(32),k64 char(32),k65 char(32),k66 char(32),k67 char(32),k68 char(32),k69 char(32),k70 char(32),k71 char(32),k72 char(32),k73 char(32),k74 char(32),k75 char(32),k76 char(32),k77 char(32),k78 char(32),k79 char(32),k80 char(32),k81 char(32),k82 char(32),k83 char(32),k84 char(32),k85 char(32),k86 char(32),k87 char(32),k88 char(32),k89 char(32),k90 char(32),k91 char(32),k92 char(32),k93 char(32),k94 char(32),k95 char(32),k96 char(32),k97 char(32),k98 char(32),k99 char(32),k100 char(32)) type MyISAM;

https://aspx.pl/zabawa/zabawam.7zip mały plik wejściowy ~0,17mb należy go rozpakować, następnie zaimportować poprzez:

mysqlimport --fields-terminated-by=, -u [login] -p[hasło] [nazwa_bazy] [dokladny adres pliku]

przykład:

mysqlimport --fields-terminated-by=, -u root -phaslo [zabawa] [c:\zabawam.txt]

Duży plik będzie za ~3h.

pozdro 600

:D

potęga umysłu

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności