User Tools

Site Tools


Sidebar

Public
Internal
public:it:database

This is an old revision of the document!


Database

Performance

MariaDB

ext4 mount options

optiondescription
noatimeaccess timestamps on the filesystem are not updated.
commit=60The sync interval for data and metadata can be increased by providing a higher time delay to the commit option.
barrier=0/nobarrierCareful! Read about this on the Arch wiki.

Backup

MYSQL

shell> mysqldump --databases db1 db2 db3 > dump.sql
mysqldump --all-databases > dump.sql

JSONB Cheatsheet

Select items by the value of a first level attribute (#1 way)

You can query with the `@>` operator on `metadata`. This operator can compare partial JSON strings against a JSONB column. It’s the containment operator. For this case you may need to add a GIN index on `metadata` column.

SELECT * FROM users WHERE metadata @> '{"country": "Peru"}';

Select items by the value of a first level attribute (#2 way)

The `→>` operator gets a JSON object field as text. Use it if you want to query a simple field in a JSONB column. You might add a B-tree index on `metadata→>'country'`.

SELECT * FROM users WHERE metadata->>'country' = 'Peru';

Select item attribute value

Once again, the `→>` operator gets a JSON object field as text. Just use directly it in the `SELECT`.

SELECT metadata->>'country' FROM users;

Select only items where a particular attribute is present

You can use the `→>` operator with the classic operator you use on text: `=`,`<>`,`IS NULL`, etc. Do not forget to index `metadata→>'country'` with a B-tree index.

 SELECT * FROM users WHERE metadata->>'country' IS NOT NULL; 

Select items by the value of a nested attribute

You can use both `@>` or `→>`, just like for first level attribute. Add an index according to your choice.

SELECT * FROM users WHERE metadata->'company'->>'name' = "Mozilla"; SELECT * FROM users WHERE metadata @> '{"company":{"name": "Mozilla"}}';

Select items by the value of an attribute in an array

Remembering `@>` operator checks containment in a JSONB column, you can query on an array like `{“x”: [“a”, “b”, “c”]“}` by just passing `{“x”:[“a”]}` to the `WHERE` clause:

SELECT * FROM users WHERE metadata @> '{"companies": ["Mozilla"]}';

IN operator on attributes

Sometimes, we may need to select items where the attributes inside a JSONB column matches a bunch of possible values.

SELECT * FROM users WHERE metadata->>'countries' IN ('Chad', 'Japan');

Insert a whole object

Use `UPDATE … SET` as usual and pass the whole object as JSON.

UPDATE users SET metadata = '{"country": "India"}';

Update or insert an attribute

Use the `||` operator to concatenate the actual data with the new data. It will update or insert the value.

UPDATE users SET metadata = metadata || '{"country": "Egypt"}';

Removing an attribute

The operator - removes a key from an object.

UPDATE users SET metadata = metadata - 'country';

MYSQL/MARIADB slow queries

Enable Logging

MariaDB [(none)]> show global variables like 'slow%log%';
+---------------------+-------------------------+
| Variable_name       | Value                   |
+---------------------+-------------------------+
| slow_query_log      | ON                      |
| slow_query_log_file | /var/log/mysql/slow.log |
+---------------------+-------------------------+
MariaDB [(none)]> set global slow_query_log_file='/var/log/mysql/slow.log';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> set global slow_query_log=ON;
Query OK, 0 rows affected (0.001 sec)
public/it/database.1614293186.txt.gz · Last modified: 2021/02/25 16:46 by phil