[ svepomalo @ 17.09.2022. 15:07 ] @
Zdravo svima,

ovo je tabela:
Code:

+-----------+------------------------+------+-----+---------+----------------+
| Field     | Type                   | Null | Key | Default | Extra          |
+-----------+------------------------+------+-----+---------+----------------+
| id        | bigint(20) unsigned    | NO   | PRI | NULL    | auto_increment |
| type      | enum('profile','post') | NO   |     | profile |                |
| tiktok_id | varchar(200)           | NO   |     |         |                |
| is_new    | tinyint(1) unsigned    | NO   |     | 0       |                |
| date      | varchar(20)            | NO   | MUL |         |                |
+-----------+------------------------+------+-----+---------+----------------+


i index:
Code:
ALTER TABLE `whole_logs_data` ADD INDEX `numberOne` (`date`, `type`);


Tabela ima 93.9M redova.

Ovaj query odradi za 28s:
Code:

SELECT `date`, `type`, COUNT(*) AS `total` FROM `whole_logs_data` GROUP BY `date`, `type`;

i explain:
Code:

+------+-------------+-----------------+-------+---------------+-----------+---------+------+----------+-------------+
| id   | select_type | table           | type  | possible_keys | key       | key_len | ref  | rows     | Extra       |
+------+-------------+-----------------+-------+---------------+-----------+---------+------+----------+-------------+
|    1 | SIMPLE      | whole_logs_data | index | NULL          | numberOne | 83      | NULL | 90208260 | Using index |
+------+-------------+-----------------+-------+---------------+-----------+---------+------+----------+-------------+
1 row in set (0.001 sec)


Ali ovaj vrti skoro 3 minuta
Code:

SELECT `date`, `type`, COUNT(*) AS `total`, SUM(`is_new`) AS `as_new` FROM `whole_logs_data` GROUP BY `date`, `type`;

i expain

Code:

+------+-------------+-----------------+-------+---------------+-----------+---------+------+----------+-------------+
| id   | select_type | table           | type  | possible_keys | key       | key_len | ref  | rows     | Extra       |
+------+-------------+-----------------+-------+---------------+-----------+---------+------+----------+-------------+
|    1 | SIMPLE      | whole_logs_data | index | NULL          | numberOne | 83      | NULL | 90208260 | Using index |
+------+-------------+-----------------+-------+---------------+-----------+---------+------+----------+-------------+


Dakle meni treba da mi za svaki dan kaze koliko ima redova i koliko ima novih (za post i profile) zato i group by na kraju sa `type` a pre toga po danu i s toga i kompozitni index.
Kako je is_new tinynt i ima vrednosti 0 ili 1 onda mi je logicno bilo da odradim SUM nad ovom kolonom i tako dobijem koliko ima 'novih'.
Explain je isiti za oba upita kao sto vidite.
Kontam da ovaj SUM zeza, ali ne znam zasto ili nekako drugacije da se napravi upit.
Gde gresim?

Evo i data kako izgleda:
Code:

+----+---------+---------------------+--------+------------+
| id | type    | tiktok_id           | is_new | date       |
+----+---------+---------------------+--------+------------+
|  1 | profile | 7077602043296498693 |      1 | 30-08-2022 |
|  2 | profile | 6937903706689127426 |      1 | 30-08-2022 |
|  3 | profile | 7081503130034160641 |      1 | 30-08-2022 |
|  4 | profile | 7126714382477755434 |      1 | 30-08-2022 |
|  5 | profile | 7060270017213236225 |      1 | 30-08-2022 |
|  6 | profile | 6811530645399962626 |      1 | 30-08-2022 |
|  7 | profile | 6823176361516696577 |      1 | 30-08-2022 |
|  8 | profile | 7061271021571032066 |      1 | 30-08-2022 |
|  9 | profile | 109011566246670336  |      1 | 30-08-2022 |
| 10 | profile | 6828957007870592005 |      1 | 30-08-2022 |
+----+---------+---------------------+--------+------------+

[ bogdan.kecman @ 17.09.2022. 15:22 ] @
dodaj index:

(`date`, `type`, `is_new`)

umesto (date, type)

znaci dropni taj date, type koji si dodao i dodaj date, type, is_new (bitno da je po tom redosledu)

na taj nacin ne mora da dohvata ceo red iz innodb tabele da bi znao sta je u is_new vec moze to da cita iz indexa koji je, ako si ok iskonfiguriso masinu, u memoriji a ne na disku.

to je generalno max sto mozes da uradis ...

ako ti je to sporo onda mozes da napravis trigere na whole_logs_data tabeli koji ce da ti odrzavaju neku tabelu koja glumi materialized view `date`, `type`, `total`, `as_new` tako da na svaki insert/update/delete updateujes tu tabelu odgovarajucim vrednostima .. sitno ces da usporis insert/edit/delete a imaces trenutno informacije o tim statusima ...

ako ti je to smor, prebaci se na oracle cloud i stavi tu tabelu u heatwave storage engine i imaces te group_by count() i sum() trenutacno na petabajtima podataka za skoro nista para


da i .. sada gledam na sta ti lici data .. promeni taj type da nije string nego id kontam da ti je to jos jedan tinyint .. uzimace mnogo manje mesta index u ramu
[ svepomalo @ 17.09.2022. 15:39 ] @
Vazi sada cu da probam sa date, type, is_new indexom.
Sto se tice masine evo ovo sto sam budzio sam (i koliko znam):
Server version: 10.3.36-MariaDB-1:10.3.36+maria~ubu2004-log - mariadb.org binary distribution
Znam da nije latest i da je MariaDB, ali jbg, nisam ga ja instaliravao....

Code:

# MariaDB database server configuration file.
#
# You can copy this file to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.

# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port        = 3306
socket        = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket        = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
#
# * Basic Settings
#
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
port        = 3306
basedir        = /usr
datadir        = /var/lib/mysql
tmpdir        = /tmp
lc_messages_dir    = /usr/share/mysql
lc_messages    = en_US
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 127.0.0.1
#
# * Fine Tuning
#
max_connections        = 4000
connect_timeout        = 900
wait_timeout        = 600
max_allowed_packet    = 256M
thread_cache_size       = 128
sort_buffer_size    = 4M
bulk_insert_buffer_size    = 16M
tmp_table_size        = 32M
max_heap_table_size    = 32M
#
# * MyISAM
#
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched. On error, make copy and try a repair.
myisam_recover_options = BACKUP
key_buffer_size        = 128M
#open-files-limit    = 2000
table_open_cache    = 400
myisam_sort_buffer_size    = 512M
concurrent_insert    = 2
read_buffer_size    = 2M
read_rnd_buffer_size    = 1M
#
# * Query Cache Configuration
#
# Cache only tiny result sets, so we can fit more in the query cache.
query_cache_limit        = 128K
query_cache_size        = 0
# for more write intensive setups, set to DEMAND or OFF
#query_cache_type        = DEMAND
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# we do want to know about network errors and such
log_warnings        = 2
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log[={0|1}]
slow_query_log_file    = /var/log/mysql/mariadb-slow.log
long_query_time = 10
#log_slow_rate_limit    = 1000
log_slow_verbosity    = query_plan

#log-queries-not-using-indexes
#log_slow_admin_statements
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id        = 1
#report_host        = master1
#auto_increment_increment = 2
#auto_increment_offset    = 1
log_bin            = /var/log/mysql/mariadb-bin
log_bin_index        = /var/log/mysql/mariadb-bin.index
# not fab for performance, but safer
#sync_binlog        = 1
expire_logs_days    = 10
max_binlog_size         = 100M
# slaves
#relay_log        = /var/log/mysql/relay-bin
#relay_log_index    = /var/log/mysql/relay-bin.index
#relay_log_info_file    = /var/log/mysql/relay-bin.info
#log_slave_updates
#read_only
#
# If applications support it, this stricter sql_mode prevents some
# mistakes like inserting invalid dates etc.
#sql_mode        = NO_ENGINE_SUBSTITUTION,TRADITIONAL
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
default_storage_engine    = InnoDB
innodb_buffer_pool_size    = 48G
innodb_log_file_size =  1024M
innodb_log_buffer_size    = 8M
innodb_autoinc_lock_mode = 2
innodb_file_per_table    = 1
innodb_open_files    = 400
innodb_io_capacity    = 1000
innodb_io_capacity_max = 2000
innodb_flush_method    = O_DIRECT
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

#
# * Galera-related settings
#
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

[mysql]
#no-auto-rehash    # faster start of mysql but no tab completion

[isamchk]
key_buffer        = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!include /etc/mysql/mariadb.cnf
!includedir /etc/mysql/conf.d/


Masina je 64GB na hetzneru.

Ja otvorio oracle cloud, i nista mi nesto nije jasno :D
Jel preporucijes da ceo server tamo prebacim ili samo bazu?
Baza znaci kao smrdljivi AVS (rds) ili?
Ako je samo baza, moze neki link? :)
[ svepomalo @ 17.09.2022. 15:42 ] @
Sto se tice `type` kolone, s obzirom da je type enum, zar nije isto sto i int?
[ svepomalo @ 17.09.2022. 15:44 ] @
Opaaaaaa, radiiii sa
Code:

ALTER TABLE `whole_logs_data` ADD INDEX `numberOne` (`date`, `type`, `is_new`);

Bukvalno je isti execution time :) :)
Hvalaaa :)
[ bogdan.kecman @ 17.09.2022. 16:00 ] @
Citat:
Sto se tice `type` kolone, s obzirom da je type enum, zar nije isto sto i int?

ne vidim da je enum iz postavljenog problema, mada svejedno ja licno ne podnosim enum, tinyint rulez :D


Citat:
Znam da nije latest i da je MariaDB, ali jbg, nisam ga ja instaliravao....

a vidi sad je jako glupo da ti ja to pricam kao neko ko radi za oracle ali poznato je da ja prilicno lepo govorim i konkurenciji i prilicno realno... marija je g..no :( .. monti je okupio ekipu koja ga je slusala i ranije i koja je prihvatala njegovu ideju da open source projekat ne treba da ima tim koji ga testira i da to treba da testira community i za to su toliko puni bagova da to boli... nemaju nijedan njihov feature (sve sto vidis od feature-a kod njih osim njihov columnar koji je po nti put zabataljen jer je jedini covek koji ga je pisao digao ruke od cele te firme po treci put, dakle sve osim toga je ukraden oracle enterprise kod, koji nije updateovan godinama, nemaju bukvalno nista svoje i to sto imaju je bagovito u pm.. ) tako da .. sta bih ti rekao, ako ti se gadi oracle jer je velika firma, jer prave velike pare, jer su gadni i smaraci i imaju vise advokata nego developera, iako jedini mysql napredak pravi taj isti oracle i niko drugi, onda nemoj da uzmes oracle binaries za mysql, uzmi binaries od perkone, dobijes tamo i galeru i svasta nesto .. zaobidji mariju mnogo ce te manje boleti glava

Citat:
Bukvalno je isti execution time :) :)

pa cita iz indexa, pre ove izmene ti je jedno citao iz indexa a drugo morao da cita iz innodb data tabele, sada sve sto imas u upitu ima dostupno u indexu tako da bi exec time trebalo da je slican...

sva dalja ubrzanja od toga su koriscenje boljih storage engine-a za agregatne funkcije... npr postgresql sa gpu ubrzanjem bi ti to spustio verovatno na pola (pod uslovom da imas podrzan dobar gpu u tom serveru naravno)
[ svepomalo @ 17.09.2022. 16:12 ] @
Jasno sve :)

Citat:

ne vidim da je enum iz postavljenog problema, mada svejedno ja licno ne podnosim enum, tinyint rulez :D

Nisam ja pravio bazu, i ja volim tinyint :D

Reci mi sto se tice config-a, jel ok ili bi nesto dodao/oduzeo? :)
[ bogdan.kecman @ 17.09.2022. 16:26 ] @
pa zavisi kako ti se ponasa baza, kako ti se ponasa server, kolika je baza etc ... vidim 4k konekcija a samo jedan bufferpool
pogledaj npr: https://www.percona.com/blog/2...tances-do-you-need-in-mysql-8/

da li si siguran da ti "innodb_flush_method = O_DIRECT" treba? da li si probao kako se ponasa bez njega, na raznim kernelima i fajl sistemima ume da radi bolje bez... meni na hz-u radi bolje bez toga

"isamchk" -> nemoj me zezas da i dalje imas myisam tabele negde?

io capacity mi deluje mali .. ne znam jel to dedicated masina za mysql ili ?

sve u svemu ne vidim nista znacajno lose tu
[ agvozden @ 18.09.2022. 09:42 ] @
date | varchar(20)

prebaci ovo na datetime ili timestamp, bolje i int od stringa.
[ bogdan.kecman @ 18.09.2022. 12:55 ] @
good find :D to nisam ni video :) ... obavezno pobeci tu od stringa, osisace se jos koja sekunda
[ oracle_kid @ 18.09.2022. 16:43 ] @
jedno brzo pitanje koje nema veze sa ovim ali me interesuje

zasto mi se velicina tabele povećava nakon DELETE sloga, naime imam tabelu gde se podaci upisuju 24 sata i nakon toga brisu ( meteo stanica)
dakle na svaka 2min insert i delete > 24h interval
[ bogdan.kecman @ 18.09.2022. 16:56 ] @
napravis posebnu temu kad nema veze sa ovim :D

sta znaci "povecava"?

delete je u bazama podataka vrlo kompleksna procedura i ne brise se
fizicki blok iz tabele gotovo nikada tako da kada uradis delete tabela
se na disku fizicki nece smanjiti (tj, nece u tom trenutku svakako, u
buducnosti hoce kada uradis dovoljno puta delete, razlicito radi na
razlicitim storage engineima, na psql-u imas vakum da to sredis kada
zelis, inodb ima svoj nacin hendlovanja toga sa prepisivanjem nove date
preko toga i celim paging sistemom koji nije jednostavan...) ... ako na
innodb hoces bas da oslobodis "odma" prostor na disku mozes da
rebildujes tabelu ali to je sport i io intenzivan proces
[ oracle_kid @ 18.09.2022. 17:08 ] @
ma znam, ali me mrzelo, neka brišu dušmani :)
e sad da se vratimo na pogrešnu temu
tabela je Memory u MySQL, i veličinu sam slučajno primetio u phpMyadm stats kada se klikne na bazu
[ oracle_kid @ 18.09.2022. 17:11 ] @
a povećava znači veća iz dana u dan, a br slogova isti jer se dodaje i briše
[ bogdan.kecman @ 18.09.2022. 17:16 ] @
memory tabela se smanjuje kako treba iako isto ne odma .. a pma je vnogo
tako da nemoj preterano da verujes u to sto pokazuje :D .. mysql ne
odrzava vise tu vrstu metadate vec to radi statistika i onda su sve te
informacije samo informativnog karaktera nemaju veze sa realnim stanjem
[ bogdan.kecman @ 18.09.2022. 17:30 ] @
uradi
Code:
show table status imetabeleG
vidi sta ce da ti kaze,
onda uradi
Code:
alter table imetabele engine=memory;show table status 
imetabeleG
pa vidi razliku eventualno mozes da uradis pre svega
toga
Code:
show table status imetabeleGanalyze table imetabele;show 
table status imetabeleG
... problem je sto je taj status
"statisticki" realno ne pokazuje realno stanje i ta statistika radi ko
.!. kada imas pisanje/brisanje jer se tripuje da imas vise date nego sto
imas tako da je problem samo u "reportingu" nema veze sa pravom
upotrebom rama.... memory tabele alociraju vrlo male blokove memorije,
koriste dinamicke hesheve tako da je upotreba rama vrlo optimalna...
takodje kada se slogovi brisu samo se izvlace u linked liste i koriste
za sledeci insert tako da ako imas brisanje i dodavanje zauzece rama se
ne menja... jedino ta statistika i prikazivanje statistike je .!. na
bicikli ali realno zauzece rama se ne menja (tj. ako se menja onda si
nasao bag)
[ Predrag Supurovic @ 18.09.2022. 18:43 ] @
Može jedno glupo pitanje. Ako već upit ima group by, zar ne treba da ima i order by?
[ bogdan.kecman @ 18.09.2022. 19:19 ] @
ne mora, ako ti nije vazan redosled sto bi dodavao order by, order by ce
samo da uspori upit
[ oracle_kid @ 18.09.2022. 22:28 ] @
nakon detaljnijeg istrazivanja sam uvideo sledece
naime
1. kada dostigne max broj redova predvidjen programom (24h pisanja/brisanja) tabela se koliko vidim NE povecava
ali kada se obrise odredjeni broj redova vanredno, velicina tabele ostaje NEPROMENJENA iako je broj zapisa npr prepolovljen i to me je navelo na pomisao da ce se povecavati dodavanjem redova
2 naredba alter table ..engine memory nema nikakvog efekta
3 samo brisanje svih zapisa komandom DELETE bez DROP table, resetuje velicinu tabele na nulu

ovo su podaci na osnovu one statistike

sve u svemu, drago mi je da se tabela ne povecava, to mi je bilo najvaxnije, jer ovaj projekat radi na slabom Pi-ju
[ bogdan.kecman @ 19.09.2022. 02:50 ] @
to je ocekivano ponasanje, obrisani slogovi, kao sto ti napisah, se
cuvaju u linkovanoj listi i koriste za nove, ne radi se free memorije
[ svepomalo @ 19.09.2022. 18:00 ] @
Citat:
bogdan.kecman:
pa zavisi kako ti se ponasa baza, kako ti se ponasa server, kolika je baza etc ... vidim 4k konekcija a samo jedan bufferpool
pogledaj npr: https://www.percona.com/blog/2...tances-do-you-need-in-mysql-8/

da li si siguran da ti "innodb_flush_method = O_DIRECT" treba? da li si probao kako se ponasa bez njega, na raznim kernelima i fajl sistemima ume da radi bolje bez... meni na hz-u radi bolje bez toga

"isamchk" -> nemoj me zezas da i dalje imas myisam tabele negde?

io capacity mi deluje mali .. ne znam jel to dedicated masina za mysql ili ?

sve u svemu ne vidim nista znacajno lose tu


myisam je default u fajlu, ne koristim :)

4K konekcija, imam na serveru vise phpova koji se izvrsavaju paraelno i svaki zahteva konekciju ka bazi, otud i taj 4K, kako da namestim vise bufferpool?

io capacity, dedicate je masina, ima neka mala app, za statistiku samo, ovo je nvme ssd, ne znam koliko da stavim?

Za innodb_flush_method, nema pojma, sta drugo da stavim pa da vidim? :)

Hvala ti puno, svaki put kad pitam nesto, naucim i nesto novo :)
[ bogdan.kecman @ 19.09.2022. 18:49 ] @
pa ako ne koristis myisam izbaci sve vezano za myisam iz konfiga, sta ce ti ... io capacity - pogledaj https://dev.mysql.com/doc/refm.../optimizing-innodb-diskio.html

pool za php je smor :( ... realno php je smor ... mozes php-u da napravis persistent konekcije ali to ima svoje dodatne probleme .. iskreno ja sam php prestao da gledam ima bar decenija, nemam pojma :( nisam video server sa php-om bar deceniju, mozda @nkrgovic moze tu da pomogne njega zovem kada mora neki php da se namesti :)

za innodb_flush_method .. samo zakomentarises liniju, resnes server i gledas kako se ponasa, pratis ioload na masini, valjda imas neki monitoring, ako nemas bar sturi sar .. vidi kako se ponasa sa zakomentarisanim i sa odirect pa odluci kako dalje :) ..


[ nkrgovic @ 19.09.2022. 19:17 ] @
Ne znam sta tacno PHP tu uopste radi, ali ako mu je upit spor iz MySQL prompta toliko da radi 28s, moze PHP da doda i 300ms nece se osetiti :) .

Ako postoji znacajna razlika u brzini kad se radi iz PHP-a i kad se radi iz prompt-a to cemo da resimo :). Samo onda treba info : Da li se iz PHP-a upit pusta kao SQL kroz mysqli/pdo ili kroz ORM? Posto ja i PHP ORM-ovi imamo tihi rat - zbog njihove "pameti".
[ svepomalo @ 19.09.2022. 20:28 ] @
Citat:
bogdan.kecman:
pool za php je smor :( ... realno php je smor ... mozes php-u da napravis persistent konekcije ali to ima svoje dodatne probleme .. iskreno ja sam php prestao da gledam ima bar decenija, nemam pojma :( nisam video server sa php-om bar deceniju, mozda @nkrgovic moze tu da pomogne njega zovem kada mora neki php da se namesti :)


Pa zasto Bogdane tako? :D
70% i vise sajtova se vrti na php-u :D

Vazi, proveravam :)


Citat:
nkrgovic:
Ne znam sta tacno PHP tu uopste radi, ali ako mu je upit spor iz MySQL prompta toliko da radi 28s, moze PHP da doda i 300ms nece se osetiti :) .

Ako postoji znacajna razlika u brzini kad se radi iz PHP-a i kad se radi iz prompt-a to cemo da resimo :). Samo onda treba info : Da li se iz PHP-a upit pusta kao SQL kroz mysqli/pdo ili kroz ORM? Posto ja i PHP ORM-ovi imamo tihi rat - zbog njihove "pameti".


I ja ne koristim ORM :D
mysqli je lagano :)
Isto mu dodje iz prompt-a i php-a :)
[ nkrgovic @ 19.09.2022. 20:40 ] @
Citat:
Isto mu dodje iz prompt-a i php-a :)

Onda ti PHP nije usko grlo, sta god da si mu radio.
[ svepomalo @ 31.10.2022. 14:55 ] @
Da ne otvoraram novu temu, imam problem sa deadlock.

Ovo je tabela:
Code:

+---------+---------------------+------+-----+---------+----------------+
| Field   | Type                | Null | Key | Default | Extra          |
+---------+---------------------+------+-----+---------+----------------+
| id      | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| keyword | varchar(255)        | NO   | UNI |         |                |
| found   | bigint(20) unsigned | NO   | MUL | 0       |                |
+---------+---------------------+------+-----+---------+----------------+
3 rows in set (0.001 sec)

+-----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table           | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tw_keywords_bio |          0 | PRIMARY  |            1 | id          | A         |     9199931 |     NULL | NULL   |      | BTREE      |         |               |
| tw_keywords_bio |          0 | keyword  |            1 | keyword     | A         |     9199931 |     NULL | NULL   |      | BTREE      |         |               |
| tw_keywords_bio |          1 | found    |            1 | found       | A         |       12415 |     NULL | NULL   |      | BTREE      |         |               |
+-----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

Index found je zbog sort-a, keyword jer treba da je unique, otuda i ovaj insert dole.
Malo date:
Code:

+----------+---------+---------+
| id       | keyword | found   |
+----------+---------+---------+
|       62 | the     | 3469039 |
|        7 | and     | 3331014 |
|      138 | of      | 2861001 |
|      219 | de      | 2482971 |
| 10373560 | ?       | 2053714 |
|       37 | to      | 1943019 |
|       17 | in      | 1769611 |
|      125 | for     | 1711614 |
|      104 | my      | 1178274 |
|      164 | is      | 1106454 |
+----------+---------+---------+



I insert query:
Code:

Query error: Deadlock found when trying to get lock; try restarting transaction - Invalid query: INSERT INTO `tw_keywords_bio` (`keyword`, `found`) VALUES ('lieutenant', 1), ('governor', 1), ('of', 1), ('pennsylvania.', 1), ('democratic', 1), ('nominee,', 1), ('united', 1), ('states', 1), ('senate', 1) DUPLICATE KEY UPDATE `found` = `found` + 1;



Naime trebam da upisem ove urlove, koliko je puta je taj neki keyword nadjen.
To je neki scrapper, dobijam datu u json-u, uzmem description, pokupim sve reci iz stringa i onda upis u bazu.
Trenutno imam 10.41M rows a table space je: 1.7 GiB

Jel ima neko bolje resenje?