Zitat:
|
Zitat von HStev Dann indiziere mir das mal bitte so das du alle User mit Recht 0001 schnell gruppieren kannst.
Performance technich sind einzelne Felder für jedes Recht seperat und alle indiziert besser. |
na ja... das bezweifle ich inzwischen auch, kurz dachte ich, du hast recht

...
beispiel:
Code:
<?php
$sql = '
CREATE TABLE test (
userid int(11) unsigned NOT NULL auto_increment,
acl int(11) unsigned NOT NULL default '0',
PRIMARY KEY (userid)
) TYPE=MyISAM';
mysql_query($sql);
$sql = 'INSERT INTO test (acl) VALUES ';
for ($i=0;$i<1000000;$i++) { // oder einfach ein-zwei nullen mehr ...
$sql .= "(" . $i . "),";
}
$sql .= " (0) "; // unwichtig, ich will nur in der for-schleife das komma nicht überprüfen.
mysql_query($sql);
?>
die for-schleife nach belieben wiederholen, um mehr einträge zu bekommen.
ich hab grad eine tabelle mit ca. 4 millionen einträgen - wer so viele user hat, soll sich bitte mal melden.
die test-tabelle hat bewusst keinen index auf 'acl', nutzt ja (hier hat hstev recht) eh nix.
um jetzt user herauszubekommen, die die berechtigung XY haben, muss man nur die aktuelle berechtigung des users "bitwise AND " mit der berechtigung, die überprüft werden soll verknüpfen. im prinzip geht es ja nur darum: wenn das bit in beiden zahlen gesetzt ist, hat der user die berechtigung, wenn nicht - nicht.
die abfrage für berechtigung 0 ( 2^0 = 1 ) lautet also:
Code:
SELECT * FROM test WHERE acl & 1
... für berechtigung 13 ( also 1101, also user hat recht 3,2 und 0 ) braucht man also nur
Code:
SELECT * FROM test WHERE acl & 13
... hab's auf die schnelle mit phpmyadmin ausgeführt und kein skript geschrieben.
falls das query cache an ist, unbedingt SELECT SQL_NO_CACHE ausführen, sonst werden folge-abfragen immer aus dem cache geholt.
mein ergebnis:
Code:
Showing rows 0 - 29 (3578771 total, Query took 0.0007 sec)
SQL query:
SELECT SQL_NO_CACHE *
FROM `test`
WHERE acl &13
LIMIT 0 , 30
d.h. ich liege mit dem binären system bei unter 10 msec ... ich bezweifle schwer, dass ein indizierter JOIN bei der datenmenge schneller wird.
dass kein index verwendet werden kann, erklärt EXPLAIN auch, allerdings scheint es schon so zu sein, dass mySQL die werte bereits sortiert (im b*-baum) ablegt (wenn nicht, spalte indizieren, dann ist das garantiert der fall), womit die bitweisen vergleiche genauso schnell sind wie die indizierung. ... welcher unterzweig eines b*-baumes genommen werden muss, ist ja bekanntermaßen mit nur sehr wenig touches möglich.
Zitat:
|
Außerdem dient es der Übersichtlichkeit, das Binäre Rechtesystem gleicht schon fast Magic Numbers.
|
das halte ich für ein fadenscheiniges argument

...
erstens kann man sauber konstanten definieren, und zweitens die ganze ACL-kacke in einer zentralen klasse sauberst kapseln, so dass dieses argument auch nicht mehr zählt.
ich bleibe (noch) dabei: die bit-lösung ist mindestens genauso schnell, braucht aber weniger speicher und ist darüberhinaus auch noch schön.