1 2 3 4 5 6 | explain SELECT SQL_NO_CACHE `video_id` FROM `video_tag_link` WHERE `tag_id` = 2721 OR `tag_id` = 245 GROUP BY `video_id` HAVING COUNT(`video_id`) = 2 LIMIT 0, 20 |
1 2 3 4 5 6 | CREATE TABLE `video_tag_link` ( `video_id` int(11) NOT NULL, `tag_id` int(11) NOT NULL, PRIMARY KEY (`tag_id`,`video_id`), KEY `video_id_index` (`video_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
1 2 3 4 5 6 | CREATE TABLE `video_tag_link` ( `video_id` int(10) unsigned NOT NULL, `tag_id` int(10) unsigned NOT NULL, PRIMARY KEY (`tag_id`,`video_id`), KEY `video_id` (`video_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;[ |
Mja, met 'krijg een -1 van de storage engine' kan ik niet zo veel.quote:Op dinsdag 17 februari 2015 13:13 schreef Chandler het volgende:
Ik heb
[ code verwijderd ]
27,400,090 rows, MyISAM, latin1_swedish_ci, 952,3 MiB
En krijg dan met dezelfde query als hierboven Using where; Using index; Using temporary; Using filesort
-edit-
Inderdaad MyIsam, heb gepoogd InnoDB te gebruiken maar heb daar vele problemen mee om de data in te voeren op juiste manier zonder fouten...
-edit2-
En het tabel omzetten naar InnoDB wil MySQL nietKrijg een -1 van de storage engine...
quote:Op dinsdag 17 februari 2015 13:13 schreef Chandler het volgende:
Ik heb
En het tabel omzetten naar InnoDB wil MySQL nietKrijg een -1 van de storage engine...
http://www.percona.com/do(...)mporting_tables.htmlquote:If you see the following message, then you must enable innodb_file_per_table and create the table again: ERROR 1030 (HY000): Got error -1 from storage engine
Voor archieven wordt het nog wel gebruikt. Kost stuk minder ruimte qua opslag.quote:Op dinsdag 17 februari 2015 14:58 schreef KomtTijd... het volgende:
Volgens mij heb ik nog nooit anders dan InnoDB gebruikt? Ik dacht dat MyIsam een beetje ouderwets was?
Wat zegt select * from video_tag_link je? en hoe ziet die tabel eruit?quote:Op dinsdag 17 februari 2015 18:01 schreef Chandler het volgende:
Helaas niet, want alle data in de myisam tabel is uniek en zou dus geen probleem moeten opleveren... heb al een uurtje zitten googlen maar kan geen 'oplossing' hiervoor vinden...
1 2 3 4 5 6 | CREATE TABLE IF NOT EXISTS `video_tag_link` ( `video_id` int(10) unsigned NOT NULL, `tag_id` int(10) unsigned NOT NULL, PRIMARY KEY (`tag_id`,`video_id`), KEY `video_id` (`video_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | INSERT INTO `video_tag_link` (`video_id`, `tag_id`) VALUES (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (13, 1), (15, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (25, 1), (26, 1), (27, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1), (35, 1), (36, 1); |
1 2 3 4 5 6 | SELECT SQL_NO_CACHE `video_id` FROM `video_tag_link` WHERE `tag_id` = 2721 OR `tag_id` = 245 GROUP BY `video_id` HAVING COUNT(`video_id`) = 2 LIMIT 0, 20 |
1 2 3 4 5 6 7 8 9 10 | 1 SIMPLE video_tag_link range PRIMARY,video_id PRIMARY 4 NULL 6480 Using where; Using index; Using temporary; Using filesor |
Deze post uit het vorige topic verdient ook nog wel even een reactie aangezien het concept 'index' in deze reeks vaak niet echt begrepen lijkt en men enkel weet dat 'queries er sneller van worden', zonder het wat en waarom van een index te snappen. Deze site heeft wel prima verdere uitleg.quote:Op maandag 16 februari 2015 23:14 schreef raptorix het volgende:
[..]
Volgens mij heeft een index geen zin op een integer, maar daar twijfel ik even over, of dat puur op numeriek is of een autoID (bestaat dat in MySql?)
1 2 3 4 | <select name="divisie" form="divisieform"> <option value="1">Super lig</option> <option value="2">2. Lig</option> </select> |
Thx, ik kende deze theorie wel, ik weet niet hoet met mysql zit, maar in sqlserver kun je bij een index ook een fragmentation rate aangeven. Gebruik je niet heel vaak, maar met name wanneer performance belangrijk is valt er wel mee te tunen.quote:Op woensdag 18 februari 2015 09:46 schreef Monolith het volgende:
[..]
Deze post uit het vorige topic verdient ook nog wel even een reactie aangezien het concept 'index' in deze reeks vaak niet echt begrepen lijkt en men enkel weet dat 'queries er sneller van worden', zonder het wat en waarom van een index te snappen. Deze site heeft wel prima verdere uitleg.
Voor read only kun je tegenwoordig dan weer beter noSQL databases gebruiken doorgaans qua performance.quote:Op woensdag 18 februari 2015 18:39 schreef raptorix het volgende:
[..]
Thx, ik kende deze theorie wel, ik weet niet hoet met mysql zit, maar in sqlserver kun je bij een index ook een fragmentation rate aangeven. Gebruik je niet heel vaak, maar met name wanneer performance belangrijk is valt er wel mee te tunen.
Zelf heb ik in verleden veel aan Funda gewerkt, met name aan de eerste versies heb ik veel aan de search gewerkt dus wel bekend met tuning
De eerste versie van Funda was ook een readonly database, dat scheelt je al snel 30 procent performance omdat zodra een database in readonly is, hij geen rekening hoeft te houden met locking of aangepaste indices.
Fragmentatie is volgens mij in deze betekenis de mogelijkheden om je index te updaten, zoals ik het altijd begrepen hebt werkt het net als in papieren index dat je meer ruimte hebt om wijzigingen te doen (wat uiteraard wel ten koste gaat van meer opslag, en dus performance).quote:Op woensdag 18 februari 2015 19:09 schreef Monolith het volgende:
[..]
Voor read only kun je tegenwoordig dan weer beter noSQL databases gebruiken doorgaans qua performance.
Fragmentatie is de mate waarin je index verspreid is over je opslag. Hoe meer fragmentatie, des te trager het gebruik van de index.
Nee, dat is een ander concept, fragmentatie heeft te maken met logische versus fysieke ordening, waardoor het lezen van de schijf trager gaat.quote:Op woensdag 18 februari 2015 20:03 schreef raptorix het volgende:
[..]
Fragmentatie is volgens mij in deze betekenis de mogelijkheden om je index te updaten, zoals ik het altijd begrepen hebt werkt het net als in papieren index dat je meer ruimte hebt om wijzigingen te doen (wat uiteraard wel ten koste gaat van meer opslag, en dus performance).
Klopt, ik doelde dus nie op fragmentatie maar op fillfactorquote:Op woensdag 18 februari 2015 20:19 schreef Monolith het volgende:
[..]
Nee, dat is een ander concept, fragmentatie heeft te maken met logische versus fysieke ordening, waardoor het lezen van de schijf trager gaat.
Zie bv:
https://msdn.microsoft.com/en-us/library/ms189858.aspx
Tinyint(1) = 0 t/m 9quote:Op woensdag 18 februari 2015 21:18 schreef Monolith het volgende:
Als het een Tinyint(1) is, dan klopt dat ook gewoon.
Volgens mij moet je even opzoeken wat die 1 betekent.quote:Op woensdag 18 februari 2015 21:19 schreef mstx het volgende:
[..]
Tinyint(1) = 0 t/m 9
Boolean = true/false
Hoe is dat het zelfde?
die 1 betekend 1 teken lezen toch?quote:Op woensdag 18 februari 2015 21:21 schreef Monolith het volgende:
[..]
Volgens mij moet je even opzoeken wat die 1 betekent.
Nee, tinyint(1) is een integer van 1 bit, dus een boolean.quote:
http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.htmlquote:Op woensdag 18 februari 2015 21:22 schreef wipes66 het volgende:
[..]
die 1 betekend 1 teken lezen toch?
mysql heeft geen echte boolean, dus 'boolean' is gewoon een allias voor tinyint(1) wat 8-bit is.quote:Op woensdag 18 februari 2015 21:22 schreef KomtTijd... het volgende:
[..]
Nee, tinyint(1) is een integer van 1 bit, dus een boolean.
Als ik het verander naar tinyint(3) zegt hij nog steeds dat het een boolean is.quote:Op woensdag 18 februari 2015 21:22 schreef KomtTijd... het volgende:
[..]
Nee, tinyint(1) is een integer van 1 bit, dus een boolean.
dat heb ik fout. Maar een boolean wordt wel altijd als tinyint(1) opgeslagen. Dus zo gek is het niet dat Doctrine die aanname doet.
Op zich wel, maar omdat doctrine types mapt tussen PHP en MySQL stelt het tinyint gelijk aan boolean kennelijk. Zie ook:quote:Op woensdag 18 februari 2015 21:31 schreef mstx het volgende:
[..]
Als ik het verander naar tinyint(3) zegt hij nog steeds dat het een boolean is.
Ik wil gewoon het aantal versnellingen van een auto opslaan, een tinyint leek me daar het juiste type voor.
Waarom maak je je uberhaupt druk om het database format? Laat dat lekker aan doctrine over. Die zal er waarschijnlijk een int van maken. Mocht je dat nog willen micro-optimaliseren naar een tinyint kun je dat doen na uitrol van je applicatie.quote:Op woensdag 18 februari 2015 21:31 schreef mstx het volgende:
[..]
Als ik het verander naar tinyint(3) zegt hij nog steeds dat het een boolean is.
Ik wil gewoon het aantal versnellingen van een auto opslaan, een tinyint leek me daar het juiste type voor.
Omdat ik die database al had en ik altijd de juiste datatypes probeer te gebruiken.quote:Op woensdag 18 februari 2015 21:37 schreef KomtTijd... het volgende:
[..]
Waarom maak je je uberhaupt druk om het database format? Laat dat lekker aan doctrine over. Die zal er waarschijnlijk een int van maken. Mocht je dat nog willen micro-optimaliseren naar een tinyint kun je dat doen na uitrol van je applicatie.
Dat krijg je met dat soort systemen. PostgreSQL heeft geen tinyint en sqllite weer wel dus mappen ze inderdaad een tinyint naar een boolean.quote:Op woensdag 18 februari 2015 21:36 schreef Monolith het volgende:
[..]
Op zich wel, maar omdat doctrine types mapt tussen PHP en MySQL stelt het tinyint gelijk aan boolean kennelijk. Zie ook:
http://stackoverflow.com/(...)ype-in-entity-column
ENUM ('TRUE','FALSE')quote:Op woensdag 18 februari 2015 21:19 schreef mstx het volgende:
[..]
Tinyint(1) = 0 t/m 9
Boolean = true/false
Hoe is dat het zelfde?
Je kunt je entities toch wel handmatig aanpassen naar het goeie format lijkt me?quote:Op woensdag 18 februari 2015 21:45 schreef mstx het volgende:
[..]
Omdat ik die database al had en ik altijd de juiste datatypes probeer te gebruiken.En dan is het gewoon een beetje vreemd dat een auto ineens "true" versnellingen heeft terwijl er "6" in de database staat.
Daar is een boolean inderdaad niet voor bedoeld en het levert in SQL en veel andere talen doorgaans wel vrij onverwachte informatie op als je er logische operaties mee gaat uitvoeren.quote:Op donderdag 19 februari 2015 08:51 schreef raptorix het volgende:
Alles kan, zo had ik een collega die het een goed idee vond om een nullable bool te gebruiken, en op die manier tristate te kunnen opslaan, nog nooit zoveel gezeik gehad met exports![]()
Ja klopt, er moest een sync proces via een automatisch tool naar Oracle worden gezet, in die tooling kon geen cast worden gedaan waardoor enige mogelijkheid was om al die velden te gaan omzetten, dit leverde ook weer allemaal gezeik op omdat een boolean in die tijd formeel geen null kon zijn in SQL Server, heeft echt weken gekost om dat goed gefixed te krijgen.quote:Op donderdag 19 februari 2015 09:36 schreef Monolith het volgende:
[..]
Daar is een boolean inderdaad niet voor bedoeld en het levert in SQL en veel andere talen doorgaans wel vrij onverwachte informatie op als je er logische operaties mee gaat uitvoeren.
1 2 3 4 5 | <?php SELECT * FROM bestellen INNER JOIN users ON ( bestellen.userdienodigheeft = users.IdUser ) ?> |
1 2 3 4 5 6 7 | <?php SELECT * FROM bestellen INNER JOIN users ON ( bestellen.userdienodigheeft = users.IdUser ) INNER JOIN users ON ( bestellen.userdiebesteldheeft = users.IdUser ) ?> |
Je doet twee Inner Joins op dezelfde tabel, volgens mij kun je er dan beter twee aparte queries van maken.quote:Op woensdag 25 februari 2015 20:35 schreef wobbel het volgende:
Help, ik zit in de knoei met een SQL query in PHP....
Ik heb een tabel met daarin hardware die besteld moet worden, zie onderstaande tabel:
tabel "bestellen"
volgende velden:
product
userdienodigheeft
userdiebesteldheeft
De user velden zijn ID's die ik vanuit een andere tabel "users" kan joinen
tabel "users"
iduser
naam
Als ik een JOIN die op de volgende manier kan dat prima als ik maar 1 user wil ophalen, maar hoe doe ik dat als ik de gegevens van 2 users wil ophalen? De bestelling kan nodig zijn voor user 1000 en besteld zijn door user 1028 namelijk![]()
Huidige query waarmee ik maar 1 user ophaal
[ code verwijderd ]
Mijn idee, welke uiteraard niet werkt was het volgt, maar hoe moet het wel??
[ code verwijderd ]
In beide gevallen krijg ik maar 1 veld terug, dat is 'naam' maar ik wil eigenlijk naamNodig en naamBesteld ofzo krijgen
Dat met die keywords/bijnamen begrijp ik, maar niet hoe ik aan de 2 namen van de users kom. Ik doe inderdaad twee joins op 1 tabel maar dat werkt uiteraard niet...quote:Op woensdag 25 februari 2015 20:40 schreef robin007bond het volgende:
[..]
Je doet twee Inner Joins op dezelfde tabel, volgens mij kun je er dan beter twee aparte queries van maken.
Maar je kunt het keyword 'as' gebruiken om bijnamen te geven aan kolomnamen.
Sorry, maar dan heb je je database waarschijnlijk niet optimaal ingericht.quote:Op woensdag 25 februari 2015 21:02 schreef wobbel het volgende:
[..]
Dat met die keywords/bijnamen begrijp ik, maar niet hoe ik aan de 2 namen van de users kom. Ik doe inderdaad twee joins op 1 tabel maar dat werkt uiteraard niet...
Ik zou een 2e query kunnen doen, maar dan zou ik dat voor élk resultaat moeten doen. Bij een pagina met 20 resultaten heb ik dan 21 queries (1 querie voor de resultaten inclusief join voor de 1e naam, en 20 voor de andere namen)
Je hebt mogelijk kolommen met eenzelfde naam zodat in het resultaat er één (unieke naam) overblijft.quote:Op woensdag 25 februari 2015 21:02 schreef wobbel het volgende:
[..]
Dat met die keywords/bijnamen begrijp ik, maar niet hoe ik aan de 2 namen van de users kom. Ik doe inderdaad twee joins op 1 tabel maar dat werkt uiteraard niet...
Ik zou een 2e query kunnen doen, maar dan zou ik dat voor élk resultaat moeten doen. Bij een pagina met 20 resultaten heb ik dan 21 queries (1 querie voor de resultaten inclusief join voor de 1e naam, en 20 voor de andere namen)
1 2 3 4 5 6 7 8 | SELECT b.*, u1.idUser AS idUser1, u1.naam AS naam1 u2.idUser AS idUser2, u2.naam AS naam2 FROM bestellen AS b INNER JOIN users AS u1 ON b.userdienodigheeft = u1.IdUser INNER JOIN users AS u2 ON b.userdiebesteldheeft = u2.idUser |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |