Lämpligt avgränsningstecken sparad data?

PHPportalen Forum Index » Databaser
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
bruse



Medlem i: 5408 dagar
Från: Stockholm
Status: Offline



#741199
Inlägg Skrivet: 2016-11-16 18:03      Ämne: Lämpligt avgränsningstecken sparad data? Citera

Ett exempel, har en kolumn som heter "favoritfrukt" och däri ska jag kunna spara alla frukter man gillar efter varandra.

1) Vad är lämpligt eller vedertaget avgränsningstecken mellan varje ord? Mellanslag, komma, semikolon?

2) Och hur skriver jag en sql-sats så att söker jag på "äpple" ska enbart äpple ges som resultat, men inte äpplemos (ja det är en frukt hihi).

Exempel:
KOD:
1:
SELECT favoritfrukt FROM tabellen WHERE favoritfrukt LIKE '%äpple%'

Då får jag ut både äpple och äppelmos. Vill bara ha exakt det jag skriver, alltså äpple. LIKE och % behövs ju för att söka ut en del.

(Visst kan jag lägga det i en egen tabell och joina ihop det med den andra. Men jag har så svåra prestanda problem med JOIN och GROUP så jag måste göra så här.)
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Koenigsegg



Medlem i: 2964 dagar

Status: Offline



#741200
Inlägg Skrivet: 2016-11-16 18:09      Ämne: Citera

Kan du motivera varför du vill göra såhär? Jag skulle definitivt avråda. Låt nån titta på databasdesignen om det här ger prestandaproblem? Det är en känd punkt på listan över saker att undvika, "comma separated list of doom".
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
bruse



Medlem i: 5408 dagar
Från: Stockholm
Status: Offline



#741201
Inlägg Skrivet: 2016-11-16 18:15      Ämne: Citera

Shocked

Prestandaproblem ja.

Tabellen "objekt" kör LEFT JOIN med "etiketter" och därefter GROUP på objekt_id. Tar upp till 4 sek när jag kör direkt i phpMyadmin. Tabellen objekt har bara 1200 rader.

En annan tabell "ritningar" har 32000 rader och gör inte join med något. Den går fort. Förut när den körde join med en annan tabell, tog det lång tid.

Satt index på de flesta fält, men det hjälper inte.

tmp_table_size och max_heap_table_size är uppskruvad till 67 108 864.



Om nån här vill kolla på databasdesignen, så vore jag tacksam. Vad behövs för information för det?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Koenigsegg



Medlem i: 2964 dagar

Status: Offline



#741202
Inlägg Skrivet: 2016-11-16 18:36      Ämne: Citera

Förslagsvis en databasdump, med eller utan data(helst med). ..och kanske zippad eller så Smile. Sen går man vid behov vidare och kollar på koden som använder databasen, vilka databasfrågor som faktiskt görs. Är det shared hosting?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
bruse



Medlem i: 5408 dagar
Från: Stockholm
Status: Offline



#741203
Inlägg Skrivet: 2016-11-16 19:17      Ämne: Citera

Får ni ut nåt vettigt av detta?

De två tabellerna
KOD:
1:
CREATE TABLE IF NOT EXISTS `doxs_objekt` (
2:
  `doxs_id` bigint(20) NOT NULL auto_increment,
3:
  `doxs_samling` varchar(255) NOT NULL,
4:
  `doxs_serie` varchar(255) NOT NULL,
5:
  `doxs_kategori` varchar(255) NOT NULL,
6:
  `doxs_katalog` varchar(255) NOT NULL,
7:
  `doxs_roll_admin` varchar(255) NOT NULL,
8:
  `doxs_roll_visa` varchar(255) NOT NULL,
9:
  `doxs_titel` varchar(255) NOT NULL,
10:
  `doxs_nr` varchar(255) NOT NULL,
11:
  `doxs_datum` date default NULL,
12:
  `doxs_handlaggare_mnr` int(11) default NULL,
13:
  `doxs_faststalld` varchar(255) default NULL,
14:
  `doxs_placering` varchar(255) default NULL,
15:
  `doxs_plats` varchar(255) default NULL,
16:
  `doxs_from_datum` date default NULL,
17:
  `doxs_tom_datum` date default NULL,
18:
  `doxs_om_mnr` int(11) default NULL,
19:
  `doxs_sekretess` enum('0','1') NOT NULL default '0',
20:
  `doxs_status` varchar(255) default 'publicerad',
21:
  `doxs_notering` text NOT NULL,
22:
  `doxs_andrad_mnr` int(11) NOT NULL default '0',
23:
  `doxs_andrad_datum` timestamp NULL default CURRENT_TIMESTAMP,
24:
  PRIMARY KEY  (`doxs_id`),
25:
  KEY `doxs_andrad_mnr` (`doxs_andrad_mnr`),
26:
  KEY `doxs_samling` (`doxs_samling`),
27:
  KEY `doxs_katalog` (`doxs_katalog`),
28:
  KEY `doxs_serie` (`doxs_serie`),
29:
  KEY `doxs_placering` (`doxs_placering`),
30:
  KEY `doxs_kategori` (`doxs_kategori`),
31:
  KEY `doxs_handlaggare_mnr` (`doxs_handlaggare_mnr`),
32:
  KEY `doxs_status` (`doxs_status`),
33:
  KEY `doxs_om_mnr` (`doxs_om_mnr`),
34:
  KEY `doxs_sekretess` (`doxs_sekretess`),
35:
  KEY `doxs_roll_admin` (`doxs_roll_admin`),
36:
  KEY `doxs_roll_visa` (`doxs_roll_visa`),
37:
  KEY `doxs_plats` (`doxs_plats`),
38:
  KEY `doxs_titel` (`doxs_titel`),
39:
  KEY `doxs_faststalld` (`doxs_faststalld`),
40:
  KEY `doxs_datum` (`doxs_datum`),
41:
  KEY `doxs_andrad_datum` (`doxs_andrad_datum`)
42:
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Dokumenthantering' AUTO_INCREMENT=1237 ;




KOD:
1:
CREATE TABLE IF NOT EXISTS `doxs_etiketter` (
2:
  `etikett_id` bigint(20) NOT NULL auto_increment,
3:
  `etikett_objekt_id` bigint(20) NOT NULL,
4:
  `etikett_etikett` varchar(255) NOT NULL,
5:
  PRIMARY KEY  (`etikett_id`),
6:
  KEY `etikett_etikett` (`etikett_etikett`),
7:
  KEY `etikett_objekt_id` (`etikett_objekt_id`)
8:
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Etiketter till dox objekt' AUTO_INCREMENT=2700 ;



SQL-satsen vid default sökning utan filter:
KOD:
1:
SELECT doxs_objekt.*, doxs_etiketter.* FROM doxs_objekt LEFT JOIN doxs_etiketter ON doxs_objekt.doxs_id = doxs_etiketter.etikett_objekt_id WHERE (doxs_samling = 'bilder' OR doxs_samling = 'dokument' OR doxs_samling = 'filer' OR doxs_samling = 'media' OR doxs_samling = 'tidningar') AND doxs_status = 'publicerad' AND (doxs_from_datum IS NULL OR doxs_from_datum <= '2016-11-16') AND (doxs_tom_datum IS NULL OR doxs_tom_datum >= '2016-11-16') AND doxs_andrad_mnr LIKE '%' GROUP BY doxs_id ORDER BY doxs_andrad_datum DESC, (doxs_nr+0), doxs_titel LIMIT 0, 50



En annan sql-sats:
KOD:
1:
SELECT doxs_objekt.*, doxs_bilagor.*, doxs_etiketter.* FROM doxs_objekt INNER JOIN doxs_bilagor ON doxs_objekt.doxs_id = doxs_bilagor.fil_objekt_id LEFT JOIN doxs_etiketter ON doxs_objekt.doxs_id = doxs_etiketter.etikett_objekt_id WHERE doxs_samling = fil_objekt_samling AND doxs_status = 'publicerad' AND (doxs_from_datum IS NULL OR doxs_from_datum <= '2016-11-16') AND (doxs_tom_datum IS NULL OR doxs_tom_datum >= '2016-11-16') AND fil_status = 'publicerad' AND doxs_andrad_mnr LIKE '%' GROUP BY doxs_id ORDER BY fil_andrad_datum DESC, (doxs_nr+0), doxs_titel LIMIT 0, 50


Där JOIN:as även tabell bilagor:
KOD:
1:
CREATE TABLE IF NOT EXISTS `doxs_bilagor` (
2:
  `bilaga_id` bigint(20) NOT NULL auto_increment,
3:
  `fil_objekt_id` bigint(20) NOT NULL default '0',
4:
  `fil_objekt_samling` varchar(255) NOT NULL,
5:
  `fil_katalog` varchar(255) NOT NULL,
6:
  `fil_namn` char(255) NOT NULL default '',
7:
  `fil_orgnamn` char(255) NOT NULL default '',
8:
  `fil_suffix` varchar(25) NOT NULL,
9:
  `fil_type` char(255) default NULL,
10:
  `fil_size` int(11) default NULL,
11:
  `fil_version` varchar(255) default NULL,
12:
  `fil_datum` date default NULL,
13:
  `fil_utfardare_mnr` int(11) default NULL,
14:
  `fil_status` varchar(255) NOT NULL default 'publicerad',
15:
  `fil_original` enum('0','1') NOT NULL default '0',
16:
  `fil_andrad_mnr` smallint(6) NOT NULL default '0',
17:
  `fil_andrad_datum` timestamp NOT NULL default CURRENT_TIMESTAMP,
18:
  PRIMARY KEY  (`bilaga_id`),
19:
  KEY `fil_objekt_id` (`fil_objekt_id`),
20:
  KEY `fil_katalog` (`fil_katalog`),
21:
  KEY `fil_suffix` (`fil_suffix`),
22:
  KEY `fil_type` (`fil_type`),
23:
  KEY `fil_status` (`fil_status`),
24:
  KEY `fil_original` (`fil_original`),
25:
  KEY `fil_andrad_mnr` (`fil_andrad_mnr`),
26:
  KEY `fil_objekt_samling` (`fil_objekt_samling`),
27:
  KEY `fil_utfardare_mnr` (`fil_utfardare_mnr`),
28:
  KEY `fil_version` (`fil_version`)
29:
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='Uppladdade bilagor' AUTO_INCREMENT=2028 ;
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
bruse



Medlem i: 5408 dagar
Från: Stockholm
Status: Offline



#741209
Inlägg Skrivet: 2016-11-17 18:37      Ämne: Citera

Ingen?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Koenigsegg



Medlem i: 2964 dagar

Status: Offline



#741213
Inlägg Skrivet: 2016-11-18 14:22      Ämne: Citera

Det var inga data mei databasdumpen, så jag försökte fylla den med testdata, ungefär lika många rader som hos dig. Men då körde dom där två frågorna på 0.00 sekunder. Så jag vet inte.. Dom använde index också.. Möjligtvis inte världens bästa indexering, men bättre än inget.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande MSN Messenger
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » Databaser
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic