Hirdetés

2024. június 10., hétfő

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  MySQL topic

Hozzászólások

(#2201) biker


biker
nagyúr

szóval ha a mező NULL akkor a mező != 'n' nem ad találatot (az explainben látható okból)
HA a mező '' (két aposztrof közt semmi) tehát semmi nincs benne de nem null, akkor a mező != 'n' kiadja találatnak.

Tehát NULL != semmi :( De máshol ezzel semmi gond nincs. Szuper....

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2202) nevemfel válasza biker (#2201) üzenetére


nevemfel
senior tag

Pontosan. =, !=, <> nem ad találatot NULL értékre.

Ha a mező NULL értéket vehet fel, akkor a te példád alapján az összes rekordot, ahol az aktiv mező nem 'n' értéket tartalmaz, úgy kaphatod meg, hogy:

WHERE aktiv != 'n' OR aktiv IS NULL

[ Szerkesztve ]

Rally against apathy draws small crowd

(#2203) biker válasza nevemfel (#2202) üzenetére


biker
nagyúr

Ezt a kódban kikeresni, hány lekérdezés érintett, kicsit gyilkos lenne
Egyelőre úgy tűnik hogy a tábláknál a default null helyett default ‘’ megoldja a problémát

De jó lenne tudni, az a tárhely mysql beállítás a hibás ahol ez hibás, vagy ahol ez jó
Mert eddig mondjuk 150 helyen ez nem volt hiba, a 150 tár a roossz? :)

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2204) nevemfel válasza biker (#2203) üzenetére


nevemfel
senior tag

Egyelőre úgy tűnik hogy a tábláknál a default null helyett default ‘’ megoldja a problémát

Igen, a megoldás így ezesetben jó lehet, illetve aktiv VARCHAR(1) NOT NULL DEFAULT '' még jobb.

Mert eddig mondjuk 150 helyen ez nem volt hiba, a 150 tár a roossz? :)

A NULL tudomásom szerint mindenhol így működik, ahogy leírtam, minden relációs adatbázis kezelőben, ugyanis ezt írja elő az SQL 92 szabvány.

[ Szerkesztve ]

Rally against apathy draws small crowd

(#2205) biker válasza nevemfel (#2204) üzenetére


biker
nagyúr

Ezen elgondolkoztam, és sikerült rekonstruálni a sztut

Az installer script amit írtam eddig id ugyanaz volt, meg a query. Igenám, de lusta módon csak olyanok voltak benne hogy pl mezőneve text not null (default nélkül)
Érdekes módon ha ebbe a táblába beszúrtam egy sort ahol egy ilyen mezőbe nem adtam meg értéket, akkor mivel null nem lehet üres lett. Mintha a szerveren lenne egy globális default ‘’
A mai telepítéskor feltűnt hogy beszúráskor hibával nem ír be ha nem adok meg értéket, mivel not null mezőbe kért adatot. Én meg hülye módon default null és nem default ‘’ beállítással orvosoltam a beszúrást
És valoban ezért lett ezen a szerveren az érték nélküli mező és nem üres

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2206) martonx válasza biker (#2205) üzenetére


martonx
veterán

Akkor csak jól mondtuk, hogy nincs hiba, se hibás beállítás. :)
A bénácska MySql találkozott a user errorral.

Én kérek elnézést!

(#2207) biker válasza martonx (#2206) üzenetére


biker
nagyúr

De valahol a mysql configban kell legyen egy globális default ‘’ a jelek szerint

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2208) nevemfel válasza biker (#2205) üzenetére


nevemfel
senior tag

Mintha a szerveren lenne egy globális default ‘’

Igen, a mysql használ gyári defaultokat, ha nincs megadva saját:

For data entry into a NOT NULL column that has no explicit DEFAULT clause, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:

- If strict SQL mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows are inserted.

- If strict mode is not enabled, MySQL sets the column to the implicit default value for the column data type.

MySQL :: MySQL 8.0 Reference Manual :: 11.6 Data Type Default Values

Egyébként érdemes felkészülni arra, hogy a jövőben egyre több mysql szolgáltató tér át a mysql 8-ra, ahol alapból a strict mode van beállítva. Általánosságban azt tapasztaltam, hogy az a query, ami strict módban működik, az működik non-strict módban is, ezért lokálisan már strict mode-ban fut a mysql nálam is, sctrict módban tesztelek mindent, egy-két esetet leszámítva, amikor az adott, jellemzően régebbi web framework egyszerűen nem működik strict mode beállítással.

[ Szerkesztve ]

Rally against apathy draws small crowd

(#2209) biker válasza nevemfel (#2208) üzenetére


biker
nagyúr

Köszi!

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2210) Panhard


Panhard
tag

Sziasztok!
Van egy lekérdezésem, ami így nézni:
select cast(datetime as DATE) as gpsdate from kocsi GROUP by gpsdate;
Napokat csoportosítja a datetime oszlop szerint. Kb: 1.8millio sor van az oszlopban. Egy napra kb: 2000.
Ez a lekérdezés jelenleg 1.9mp-ig tart.
Az oszlop indexelve van, Az explain lekérdezés szerint használja is. Az explain extra oszlopába ezt írja: "Using index; Using temporary; Using filesort".
Ideiglenes táblát hoz létre a lekérdezéshez. Lehet ezt másképpen csinálni, hogy sokkal gyorsabb legyen? Ne tartson majdnem 2 mp-ig?

(#2211) martonx válasza Panhard (#2210) üzenetére


martonx
veterán

gyanítom a cast-olás lassít még rajta, bár nem hiszem, hogy ezen drasztikusan tudnál még gyorsítani. Ha ennyire kritikus a sebesség, akkor érdemes lenne eleve úgy tárolnod az adatokat, hogy ne kelljen castolni.
Vagy ha kell datetime-ként is és date-ként is, lehet kipróbálnám, hogy mindkét módon redundánsan letárolnám ugyanazt az adatot.
Másik lehetőség, hogy tárold le ezt az adatot napokra groupolva is, ez persze megint redundáns tárolást jelent, de biztos, hogy gyorsabb lesz az így előre groupolt adatokat lekérdezni, mint on-the-fly groupolni sok millió adatot.

Én kérek elnézést!

(#2212) Panhard válasza martonx (#2211) üzenetére


Panhard
tag

Igen, próbáltam többféleképpen lekérdezni, de sokkal gyorsabb nem lett. Szerintem azt fogom csinálni, hogy letárolom a napokat groupolva külön táblában, ahogy te is írtad.

(#2213) nevemfel válasza Panhard (#2212) üzenetére


nevemfel
senior tag

Ha 5.7 vagy frissebb verziójú a mysql, próbáld ki generált mezővel, és arra rakott indexszel:

ALTER TABLE `teszt` ADD (
`gpsdate` DATE GENERATED ALWAYS AS (CAST(`gpsdatetime` as DATE)) STORED,
KEY `gpsdateindex` (`gpsdate`)
)

[ Szerkesztve ]

Rally against apathy draws small crowd

(#2214) nevemfel válasza nevemfel (#2213) üzenetére


nevemfel
senior tag

Persze a te eseteben a tábla neve nem `teszt`, hanem `kocsi`, illetve a `gpsdatetime` mező neve nem tudom, mi. Csak nem `datetime`?

Rally against apathy draws small crowd

(#2215) biker


biker
nagyúr

Mit szólnátok, ha olyan programkód kerülne elétek, amihez így néz ki az adatbázis? :D

CREATE TABLE `Kategóriák` (
`id` int(10) UNSIGNED NOT NULL,
`azonosító` tinytext CHARACTER SET ascii NOT NULL,
`szülö` int(10) UNSIGNED NOT NULL,
`kép` varchar(100) COLLATE utf8_hungarian_ci NOT NULL,
`háttérkép` int(11) NOT NULL,
`galéria` int(11) NOT NULL,
`sorrend` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;

CREATE TABLE `KategóriákNyelv` (
`id` int(10) UNSIGNED NOT NULL,
`nyelv` int(10) UNSIGNED NOT NULL,
`név` tinytext COLLATE utf8_hungarian_ci NOT NULL,
`leírás` text COLLATE utf8_hungarian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;

de a legjobb ahol keveri az ékezetes és ekezettelenul írt mezőket, és egy kis angolt is beletesz. nem, nem a file marad file, az fájl lett :W :W :W :W

CREATE TABLE `Termékek` (
`id` int(10) UNSIGNED NOT NULL,
`kód` varchar(30) COLLATE utf8_hungarian_ci NOT NULL,
`ár` int(10) UNSIGNED NOT NULL,
`beszerzesiar` int(11) NOT NULL,
`nyereseg` int(11) NOT NULL,
`marka` int(11) NOT NULL,
`markalink` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`kiszereles` varchar(200) COLLATE utf8_hungarian_ci NOT NULL,
`akciósár` int(10) UNSIGNED DEFAULT NULL,
`nettoar` int(11) NOT NULL,
`beszerzesiar_huf` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`beszerzesiar_eur` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`cimkek` varchar(1000) COLLATE utf8_hungarian_ci NOT NULL,
`akciókód` varchar(200) COLLATE utf8_hungarian_ci NOT NULL,
`cikkszám` varchar(100) COLLATE utf8_hungarian_ci NOT NULL,
`áfa` int(10) UNSIGNED NOT NULL,
`darab` int(10) NOT NULL,
`készletinfó` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`súly` int(11) NOT NULL,
`elektronikus` enum('NEM','IGEN') COLLATE utf8_hungarian_ci NOT NULL,
`fájl` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`állapot` enum('AKTÍV','TÖRÖLVE','ELÖKÉSZÜLETBEN') COLLATE utf8_hungarian_ci NOT NULL,
`azonosító` tinytext CHARACTER SET ascii NOT NULL,
`idöpont` datetime NOT NULL,
`kiemelt` tinyint(4) NOT NULL,
`argep` tinyint(1) NOT NULL,
`arukereso` tinyint(1) NOT NULL,
`olcsobbat` tinyint(4) NOT NULL,
`hasznalati` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`adatlap` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`video` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`videohasznalati` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`kiemeltsorrend` int(11) NOT NULL,
`sorrendegy` int(11) NOT NULL,
`sorrendketto` int(11) NOT NULL,
`sorrendharom` int(11) NOT NULL,
`sorrendnegy` int(11) NOT NULL,
`title` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`seogeneral` tinyint(4) NOT NULL DEFAULT '1',
`description` varchar(300) COLLATE utf8_hungarian_ci NOT NULL,
`sharetitle` varchar(100) COLLATE utf8_hungarian_ci NOT NULL,
`sharedescription` varchar(200) COLLATE utf8_hungarian_ci NOT NULL,
`shareimage` int(11) NOT NULL,
`osszehasonlito` tinyint(4) NOT NULL,
`osszehasonlitokategoria` int(11) NOT NULL,
`variacio` tinyint(4) NOT NULL,
`szulo` int(11) NOT NULL,
`variaciosorrend` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2216) laracroft


laracroft
aktív tag

Sziasztok
egy kis segítséget szeretnék kérni.
Itt EZ a tábla (datas).
A line és az account mező határoz meg egyértelműen egy ügyfelet.
A name mező az ügyfél értesítendője.
Keresem azokat az ügyfeleket (line+account), akiknek egyik name mezőjéhez sem tartozik email cím.
Jelen esetben nálam ezek a 4-1000 és 7-1000.
előre is köszi ;)

(#2217) Fire/SOUL/CD válasza laracroft (#2216) üzenetére


Fire/SOUL/CD
félisten

Rég nem mysql-eztem, de talán így (ha a create/drop view-hoz van engedélyed)

create or replace view myview as
select *
from t1
group by line, account
having count(email)=0;

select t1.*
from t1, myview
where t1.line = myview.line and t1.account = myview.account
order by line, account;

drop view myview;

[kép] | [kép]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#2218) laracroft válasza Fire/SOUL/CD (#2217) üzenetére


laracroft
aktív tag

Köszi a választ és hogy foglalkoztál vele, végül ez lett a megoldás:
SELECT DISTINCT CONCAT(line, '-', account)
FROM customer
WHERE CONAT(line, '-', account) NOT IN
(SELECT CONCAT(line, '-', account)
FROM customer WHERE email LIKE '%@%');

[ Szerkesztve ]

(#2219) Fire/SOUL/CD válasza laracroft (#2218) üzenetére


Fire/SOUL/CD
félisten

Utolsó sor biztos ERROR... ;]

UI: akko' 2.-5.-ig kell csak és a select * helyett select line, account   
UUI: Nem igazán értem, hogy az általad linkelt "tábla" (ami mezei Excel, Google, LO stb stb) mire volt jó... Kurvára nem az eredeti DB records...

[ Szerkesztve ]

Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)

(#2220) F1DO


F1DO
senior tag

Sziasztok!

PhPMyAdmin-ban mysql tárolt eljárást szeretnék létrehozni, szintaktikai hibát jelez, nem jövök rá hol lehet a gond - tudnátok segíteni?

Egy szimpla táblamásolás - mentési célból feladat megoldása lenne, annyi hogy a táblanévben legyen benne az aktuális év hó nap

DELIMITER //
CREATE PROCEDURE allomany_masolas(allomany VARCHAR(255))
BEGIN
DECLARE allomany_mentes_ VARCHAR(255);
DECLARE sql_C TEXT;
-- Az új táblanév létrehozása az aktuális dátum alapján
SET allomany_mentes_ = CONCAT(allomany, '_', DATE_FORMAT(NOW(), '%Y_%m_%d'));
-- SQL parancs összeállítása
SET sql_C = CONCAT('CREATE TABLE ', allomany_mentes_, ' AS SELECT * FROM ', allomany);
-- SQL parancs végrehajtása
PREPARE stmt FROM sql_C;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

(#2221) martonx


martonx
veterán

És mi a hibaüzenet?

Én kérek elnézést!

(#2222) biker válasza F1DO (#2220) üzenetére


biker
nagyúr

Az END után nincs pontosvessző, szerintem, utána // és DELIMITER ;

DELIMITER //
CREATE PROCEDURE allomany_masolas(allomany VARCHAR(255))
BEGIN
DECLARE allomany_mentes_ VARCHAR(255);
DECLARE sql_C TEXT;
-- Az új táblanév létrehozása az aktuális dátum alapján
SET allomany_mentes_ = CONCAT(allomany, '_', DATE_FORMAT(NOW(), '%Y_%m_%d'));
-- SQL parancs összeállítása
SET sql_C = CONCAT('CREATE TABLE ', allomany_mentes_, ' AS SELECT * FROM ', allomany);
-- SQL parancs végrehajtása
PREPARE stmt FROM sql_C;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END ;
//
DELIMITER ;

[ Szerkesztve ]

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2223) F1DO


F1DO
senior tag

Kicsit átírtam de nem lett jobb. Fontos infó lehet hogy 5.7-es a Mysql verzió

DELIMITER //
CREATE PROCEDURE allomany_masolas(allomany VARCHAR(MAX))
BEGIN
DECLARE tabla VARCHAR(255);
DECLARE sql_C VARCHAR(MAX);
SET tabla = CONCAT('allomany_mentes_', DATE_FORMAT(NOW(), '%Y%m%d'));
SET sql_C = CONCAT('CREATE TABLE ', tabla, ' AS SELECT * FROM ', allomany);
PREPARE stmt FROM sql_C;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END ;
//
DELIMITER ;

#1064 - A Szintaktikai hiba a 'MAX))
BEGIN
DECLARE tabla VARCHAR(MAX);
DECLARE sql_C VARCHAR(MAX);

SET ta'-hez kozeli a 1 sorban

Új phpMyAdmin ablak nyitása

(#2224) nevemfel válasza F1DO (#2223) üzenetére


nevemfel
senior tag

VARCHAR(MAX) - a MAX egy mysql függvény, de ha más lenne a neve, akkor sincs definiálva, hogy mi az.

Rally against apathy draws small crowd

(#2225) baracsi válasza F1DO (#2223) üzenetére


baracsi
tag

1. DECLARE sql_C VARCHAR(MAX); egyrészt hibás, másrészt nem kell
2. SET sql_C = helyett SET @sql_C =
3. SET sql_C = CONCAT('CREATE TABLE ', tabla, ' AS SELECT * FROM ', allomany); itt nincs az allomany változó deklaralva
4. PREPARE stmt FROM sql_C; helyett PREPARE stmt FROM @sql_C;

BEGIN
DECLARE tabla VARCHAR(255);
-- DECLARE sql_C VARCHAR(MAX);
SET tabla = CONCAT('allomany_mentes_', DATE_FORMAT(NOW(), '%Y%m%d'));
SET @sql_C = CONCAT('CREATE TABLE ', tabla, ' AS SELECT * FROM allomany');
PREPARE stmt FROM @sql_C;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

[ Szerkesztve ]

(#2226) F1DO válasza baracsi (#2225) üzenetére


F1DO
senior tag

Köszönöm az útbaigazítást, :K ez alapján is:

Közkinccsé:

tárolt eljárás, ami meghíváskor a paraméterben átadott névre (név_mentes_évhónap) illetve ugyanazon nevű forrástábla alapján úgy hozza létre az új táblát, hogy ellenőrzi az adandó táblanévvel létezik-e már tábla és ha nem, létrehozáskor megőrzi a forrás tábla beállításait (kulcs oszlop, stb):

DELIMITER //
CREATE PROCEDURE tabla_masolas(IN tablanev VARCHAR(255))
BEGIN
DECLARE uj_tabla VARCHAR(255);
SET uj_tabla = CONCAT(tablanev,'_mentes_', DATE_FORMAT(NOW(), '%Y%m%d'));

IF NOT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = uj_tabla) THEN
-- Létrehozzuk az új táblát az eredeti tábla szerkezetével
SET @sql_code = CONCAT('CREATE TABLE ', uj_tabla, ' LIKE ', tablanev);

PREPARE stmt FROM @sql_code;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- Másoljuk át az adatokat az eredeti táblából az új táblába
SET @sql_code = CONCAT('INSERT INTO ', uj_tabla, ' SELECT * FROM ', tablanev);

PREPARE stmt FROM @sql_code;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
ELSE
SELECT 'A képzendő táblanév már létezik.';
END IF;
END //
DELIMITER ;

[ Szerkesztve ]

(#2227) biker


biker
nagyúr

Sziasztok!
Hogy lehet elérni mysql-ben, hogy ha az eeredmény egy sort se érint, akkor ne NULL legyen hanem 0 vagy 1?
Coalesc nem oldja meg, az csak azt oldja meg, hogy ha van benne null sor az átlagban, akkor beleszámolja az elemekbe vagy sem

Maga a lekérdezés naplóból a belépés-kilépés közti idők átlaga
$atl_bent=$db->query("SELECT AVG(SUBSTRING_INDEX(SUBSTRING_INDEX(esemeny,' ',-2),' ',1)) FROM fitness_naplo{$_SESSION['helyszin']} WHERE esemeny LIKE '%[ {$query_tomb['id']} ]%' AND esemeny LIKE '%bent töltött idő:%'")->fetchAll();

A helyzet az, hogy kb 80-100 tárhelyen fut hibátlanul a kód, de egy új tárhelyen valami rejtélyes okból fatal errorral elszáll ha ez a sor benne van, mert a fetchall nem futtatható boolean elemen, azért boolean mert null az eredmény.
ha van idő, akkor hibátlan.

Az egy dolog, hogy senki nem tudja, melyik php vagy mysql beállítás okozza a fatal errort, ha máshol nem okoz hobát, de valahogy át lehet-e írni hogy a NULL helyett 0 legyen ha nincs egy elem sem?

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2228) martonx válasza biker (#2227) üzenetére


martonx
veterán

Gyanítom MySql-ben is létezik isnull, vagy ifnull, vagy coalesce vagy valami ilyesmi ami pont erre való, hogy null esetben valami értelmes értéket kapj vissza.

Én kérek elnézést!

(#2229) hellsing71


hellsing71
tag

'reggelt! Optimalizációs kérdésem lenne.

A DataTables-t (DT) szerveroldali feldolgozással használva, a lapozás normális működéséhez 3 adat kell:

- az össz. rekordszám,
- a kereséssel elérhető rekordszám (akár 35-250k találat, amíg nem szűkítik),
- és a full-text keresés egy oldalon megjelenítendő találatai (pl. limit 100, 25).

Mi a legjobb, ha 3 SQL-t futtatok:

- 1× COUNT, de MATCH és LIMIT nélkül (= összes rekordszám),
- 1× COUNT + MATCH, de LIMIT nélkül (= a találatok lehetséges max. száma),
- 1× nincs COUNT, de van MATCH + LIMIT (= az egy oldalon megjelenítendő adatok),

...vagy van a 3 adat egylépéses kinyerésére jobb módszer? Le tudnám kezelni php-ből, de azzal is csak a 3. lépést úszom meg, és akár 250k találata is lehet egy keresésnek, ezért ez nem tűnik jó ötletnek. Az meg nem elegáns, ha kiírom, hogy "Túl sok találat, szűkítsen".

A környezet: procedurális php 8.2, mysqli, MariaDB 10.4.

(#2230) nevemfel válasza hellsing71 (#2229) üzenetére


nevemfel
senior tag

Emlékszem, hogy régebben használtam mysql alatt a SQL_CALC_FOUND_ROWS + FOUND_ROWS párost. Ezzel a módszerrel egy lekérdezést meg tudsz takarítani a három közül, de mindenképp érdemes lemérni, melyik módszer mennyi idő-, esetleg egyéb erőforrás nyereséget hoz, mert el tudom képzelni, hogy manapság a mindenféle gyorsítótárazás korában gyakorlatilag semennyi különbség nem lesz.

Rally against apathy draws small crowd

(#2231) martonx válasza hellsing71 (#2229) üzenetére


martonx
veterán

Rosszul állsz hozzá. Mivel lapozást használsz, soha nem kell a teljes táblát listáznod. És biztosra veszem, hogy kettő lekérdezés elég.

Select akármi from tábla
Where feltételek (nyilván az alap eset, amikor még where sincs) query

Ez az alap lekérdezésed, ami csak egy alap, de ilyen formában sose kell lefuttatnod.

1. lekérdezés: alap query count-ja, azaz maxmimum hány sornyi adatod van (ez is erőforrásigényes tud lenni, de amit mondtál 250k adatsor nudli, majd 6 milliárd sornál ráérhetsz ezen aggodni)
2. lekérdezés: alap lekérdezés az aktuális page-nek megfelelően (pl. 20-dik pagenek megfelelő 10 sor)

azaz sose fogsz a megjelenített sorok számánál (pl. 10/20/50/100) többet elkérni a db-től. Hiszen pont erre való a pagelés.

Én kérek elnézést!

(#2232) biker válasza hellsing71 (#2229) üzenetére


biker
nagyúr

ennél egyszerűbb

Nálam több százezer soros táblák lapozóval

<script>

$(document).ready(function(){
$('#naploTabla').DataTable({
'processing': true,
'serverSide': true,
'serverMethod': 'post',
'ajax': {
'url':'ajax_naplo_file.php'
},
'columns': [
{ data: 'datum' },
{ data: 'esemeny' },
{ data: 'ertek' },
]
});
});

</script>

a feldolgozó pedig

<?php
include("master.php");

// Create connection
try{
$conn = new PDO("mysql:host=$host;dbname=$adatbazis","$sql_felhasznalo","$sql_jelszo",
array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;',
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
));
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
die('Unable to connect with the database');
}
## Read value
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value

$searchArray = array();

## Search
$searchQuery = " ";
if($searchValue != ''){
if (substr_count($searchValue, " ")==0)
{
$searchQuery = " AND (datum LIKE :datum or
esemeny LIKE :esemeny ) ";
$searchArray = array(
'datum'=>"%$searchValue%",
'esemeny'=>"%$searchValue%"
);

}
else
{
$searchValue_arr=explode(" ", $searchValue);
$i=1;
foreach($searchValue_arr AS $expl_value) {
$searchQuery.= " AND (datum LIKE :datum$i or
esemeny LIKE :esemeny$i ) ";
$searchArray = array(
"datum$i"=>"%$expl_value%",
"esemeny$i"=>"%$expl_value%"
);
}
}

}

## Total number of records without filtering
$stmt = $conn->prepare("SELECT COUNT(*) AS allcount FROM fitness_naplo{$_SESSION['helyszin']} ");
$stmt->execute();
$records = $stmt->fetch();
$totalRecords = $records['allcount'];

## Total number of records with filtering
$stmt = $conn->prepare("SELECT COUNT(*) AS allcount FROM fitness_naplo{$_SESSION['helyszin']} WHERE 1 ".$searchQuery);
$stmt->execute($searchArray);
$records = $stmt->fetch();
$totalRecordwithFilter = $records['allcount'];

## Fetch records
$stmt = $conn->prepare("SELECT * FROM fitness_naplo{$_SESSION['helyszin']} WHERE 1 ".$searchQuery." ORDER BY ".$columnName." ".$columnSortOrder." LIMIT :limit,:offset");

// Bind values
foreach($searchArray as $key=>$search){
$stmt->bindValue(':'.$key, $search,PDO::PARAM_STR);
}

$stmt->bindValue(':limit', (int)$row, PDO::PARAM_INT);
$stmt->bindValue(':offset', (int)$rowperpage, PDO::PARAM_INT);
$stmt->execute();
$empRecords = $stmt->fetchAll();

//echo "ok";

$data = array();

foreach($empRecords as $row){
// echo "ok";
$data[] = array(
"datum"=>$row['datum'],
"esemeny"=>translated($row['esemeny'], $_GET['sel_lang']),
"ertek"=>$row['ertek']
);
}

## Response
$response = array(
"draw" => intval($draw),
"iTotalRecords" => $totalRecords,
"iTotalDisplayRecords" => $totalRecordwithFilter,
"aaData" => $data
);

echo json_encode($response);
?>

nyilván testre kell szabnod, de az elv ennyi, ajaxxal hívogatja, és küldi melyik 10 vagy 25 vagy 100 sort kérje le

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2233) hellsing71 válasza martonx (#2231) üzenetére


hellsing71
tag

Valóban kihagyhatom, hogy össz hány rekord van a táblában, a lapozás anélkül is működik., csak furcsán jön ki, hogy szűrés nélkül a lapozó mellett az jelenik meg, hogy

Showing 1 to 20 of 1.212.509 entries (ennyi rekord van most a táblában)

... de szűréssel meg az, hogy

Showing 1 to 20 of 11.612 entries (filtered from 11.612 total entries) (ez a találatok teljes száma, és a második 11k helyén az 1.212.509-nek kéne megjelennie, mert így valótlan a filtered from utáni érték).

A tábla teljes hossza a "filtered from" helyes megjelenéséhez kell.

(#2234) hellsing71 válasza biker (#2232) üzenetére


hellsing71
tag

Bocs, ez nekem nem jön át. Neked is 3 sql query-d van:

Összes rekord a táblában:
SELECT COUNT(*) AS allcount FROM fitness_naplo{$_SESSION['helyszin']}

Szűrt rekordok teljes száma:
SELECT COUNT(*) AS allcount FROM fitness_naplo{$_SESSION['helyszin']} WHERE 1 ".$searchQuery

Szűrt rekordokból a megjelenítendők tartalma:
SELECT * FROM fitness_naplo{$_SESSION['helyszin']} WHERE 1 ".$searchQuery." ORDER BY ".$columnName." ".$columnSortOrder." LIMIT :limit,:offset

Összevonhatnánk az első kettőt egy UNION-nal (mindig csak 2db szám az eredmény), de az 1db webszerver-db-webszerver kommunikáció elhagyásán gondolom csak századmásodperceket lehet nyerni, akkora terhelésem meg sohasem lesz, hogy ez bármit jelentsen.

(#2235) biker válasza hellsing71 (#2234) üzenetére


biker
nagyúr

nem vonhatod össze, mert más alapján számol. szerintem. de valóban, századokat jelent csak

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2236) nevemfel válasza hellsing71 (#2233) üzenetére


nevemfel
senior tag

Valóban kihagyhatom, hogy össz hány rekord van a táblában, a lapozás anélkül is működik.

Nem hiszem, hogy a teljes táblára a COUNT queryt érdemes kihagyni, szerintem ez a leggyorsabb lekérdezés.

Rally against apathy draws small crowd

(#2237) hellsing71 válasza biker (#2235) üzenetére


hellsing71
tag

De, összevonhattam, simán megcsinálta. Csak ahogy írtam: minek?

SELECT COUNT(*) FROM `table1`
UNION
SELECT COUNT(*) FROM `table1` WHERE MATCH( field1, field2, field3, field4 ) AGAINST( 'Lookforthis' IN BOOLEAN MODE);

Eredmény:

count(*)
13500
238

sZERK: KÖSZÖNÖM AZ ÖTLETEKET! (HÜJE cAPSlOCK)

[ Szerkesztve ]

(#2238) biker válasza hellsing71 (#2237) üzenetére


biker
nagyúr

de ez ettől még két lekérdezés, csak egybeágyaztad

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2239) szricsi_0917


szricsi_0917
tag

Sziasztok,

Egy kis segítséget szeretnék szeretnék kérni.
Mysql és phpmyadmin-t használok.
A phpmyadmin felületén szeretnék importálni egy táblát amiben 200.000 sor van.
1000-1500 sor után mindig megáll és a következő hibát dobja fel:


Merre induljak, hogy megtaláljam a probléma forrását?

(#2240) disy68 válasza szricsi_0917 (#2239) üzenetére


disy68
aktív tag

sokáig tart a művelet vagy túl nagy a fájl a szervernek

vagy kell több erőforrás alá vagy ne a phpmyadmin-on csináld, hanem parancssorból vagy pl. mysql workbench-ből (esetleg saját kód saját gépedről)

“Yeah, well, you know, that’s just, like, your opinion, man.” — The Dude

(#2241) szricsi_0917 válasza disy68 (#2240) üzenetére


szricsi_0917
tag

A fájl maga kb 40Mb.
Annyira nem vagyok profi a témában sajnos.
A phpmyadmin felülete a http miatt fut korlátba?
Az egész mögött amúgy egy ubuntu server van és azon egy aaPanel.
Próbáltam ezeket változtatni, de nem sok eredménye lett:
post_max_size
upload_max_filesize
max_execution_time
max_input_time
memory_limit

Milyen beállításokat kéne még megváltoztatni?

[ Szerkesztve ]

(#2242) nevemfel válasza szricsi_0917 (#2241) üzenetére


nevemfel
senior tag

A PHP error logot kellene megnézni.

Rally against apathy draws small crowd

(#2243) szricsi_0917 válasza nevemfel (#2242) üzenetére


szricsi_0917
tag

Szia,

Megnézem majd és esetleg jelentkezek még, mert hátha másban is látható teljesítmény növekedés lesz, ha meglesz a probléma forrása, de egyelőre magát az importot sikerül megoldanom a workbench segítségével. Érdekes módon a majdnem 500.000 sor alig volt egy perc.

(#2244) biker


biker
nagyúr

Kedves ügyfélnél összehányta magát a xampp alatti mysql-ben egy tábla
sem a szerkezet, sem az adatok nem nyerhetők ki, lockolva van, és sérültnek jelzi, restart megvolt, kézzel minden mókolás, hogy legalább a mysql szerver elinduljon, és a myadminba beléphessek megvolt, de a repair tables és a repair table táblaneve sem segít, nem tudja javítani, szerinte hiányzik az index
ha nem találnak egy backupot a xampp/mysql/data/táblaneve fileokból, akkor így jártak? google összes helpje eddig nem segített.

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

(#2245) baracsi válasza biker (#2244) üzenetére


baracsi
tag

REPAIR TABLE [táblanév] USE_FRM; sem segít?

(#2246) biker válasza baracsi (#2245) üzenetére


biker
nagyúr

nem, azt a kapcsolót elfelejtettem, ha valaki feléleszti a teamviewerüket akkor máris :)

Elektromos autó töltő berendezések | Mesterséges növényvilágítás | Mai ajánlatunk: www.gerisoft.hu | www.e-autotoltokabel.hu | www.agrar-vilagitas.hu |

Útvonal

Fórumok  »  Szoftverfejlesztés  »  MySQL topic
Copyright © 2000-2024 PROHARDVER Informatikai Kft.