2023.12.20(수)
SHOW DATABASES
)email(unique) & password 조합으로 로그인
id | name | password | contact | created_at | |
---|---|---|---|---|---|
1 | kim@mail.com | 김서형 | 5678 | 010-1234-5678 | |
2 | go@mail.com | 고민시 | 3456 | 010-9012-3456 | |
3 | cho@mail.com | 조미연 | 1234 | 010-7890-1234 | |
4 | lee@mail.com | 이혜인 | 9012 | 010-5678-9012 |
Table 생성
+) created_at column 추가
GUI에서 Table에 직접 삽입
id | name | sub_num | video_cnt | user_id |
---|---|---|---|---|
1 | gominsi | 2158000 | 546 | 2 |
2 | kim_seohyung | 336000 | 248 | 1 |
3 | gidle | 12020000 | 4552 | 3 |
4 | hyein.newjeans | 10730000 | 492 | 4 |
5 | noodle.zip | 4956000 | 430 | 3 |
Apply 시 나오는 SQL에서 INDEX user_id_idx (user_id ASC) VISIBLE
의 의미 (feat. ChatGPT)
이 MySQL 쿼리는 데이터베이스 테이블에서 인덱스를 생성하는 명령입니다. 간단히 말해서, 이 명령은 "user_id" 열에 대한 인덱스를 만든다는 것을 나타냅니다.
여기에서 사용된 용어를 설명하겠습니다:
INDEX
: 데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 데이터 구조입니다. 인덱스는 특정 열(또는 열의 조합)에 대한 정렬된 복사본으로, 검색 작업을 빠르게 만들어줍니다.
user_id_idx
: 이 부분은 인덱스의 이름을 나타냅니다. "user_id_idx"는 이 인덱스의 이름이며, 쿼리를 통해 이 이름으로 인덱스에 접근할 수 있습니다.
(user_id ASC)
: 이 부분은 인덱스가 어떻게 정렬되는지를 나타냅니다. "ASC"는 오름차순(ascending)을 의미하며, 따라서 "user_id" 열의 값이 오름차순으로 정렬된 인덱스가 생성됩니다.
VISIBLE
: 이 부분은 MySQL 8.0에서 추가된 옵션으로, 인덱스의 가시성을 나타냅니다. "VISIBLE"는 이 인덱스가 테이블에 실제로 보이는(visible) 인덱스인지를 나타냅니다. "INVISIBLE"로 설정하면 인덱스가 테이블에서는 보이지 않지만 쿼리 옵티마이저가 여전히 사용할 수 있습니다.
⇒ 모든 데이터를 순회하여 찾는 기존 방식 대신 Map처럼 해당 row를 바로 참조할 수 있는 index를 생성해서 검색 속도를 향상!
npm install --save mysql2
로 Node.js에 나온 지 얼마안 된 따끈따끈한 mysql2 모듈 설치 (기존 mysql 모듈의 성능을 향상시킴🔗)📢 화면에 보여지는 값만 바뀌는 것이고 실제 DB에 저장된 값이 바뀐 것 ❌
→ 값 자체는 항상 UTC로 저장됨🔗
현재 time_zone 설정 확인 : SELECT @@global.time_zone, @@session.time_zone;
@@global.time_zone 설정 : SET GLOBAL time_zone = 'Asia/Seoul';
@@session.time_zone 설정 : SET time_zone = 'Asia/Seoul';
+) time zone 자세히 알아보기
❓ OS 환경의 time zone대로 system_time_zone 변수가 설정된다면, 내 컴퓨터 시간은 한국 시간으로 잘 나오고 있는데 왜 time zone setting을 해주기 전에는 UTC로 나왔을까?
- 잊지 말자. 우리는 Docker에서 DB를 사용하고 있다.
- Docker Container의 Time Zone은 default로 UTC를 사용하기 때문에 system_time_zone 변수의 값이 UTC인 것이다.
하지만 이렇게 SET 명령어로 설정한 time zone value는 서버가 재시작되면 사라지는 일회용임🔗 → 영구적으로 변경하려면 mariadb option file을 직접 수정해주어야 함
connection-option | Description | Default value | + |
---|---|---|---|
host | 접속할 database의 hostname. | localhost | local에서 실행하므로 그냥 default 값을 사용하면 됨 |
port | port number. | 3306 | 이미 mariadb의 port number를 3306으로 설정해두었으므로 그냥 default 값을 사용하면 됨 |
timezone | MySQL server에 구성된 timezone. JavaScript의 Date 객체를 type cast할 때 사용되는 timezone. 'local' , 'Z' , +HH:MM 또는 -HH:MM 형태의 offset 사용 가능. | 'local' | 'Asia/Seoul' 로 설정해주면 됨 |
dateStrings | Date types (TIMESTAMP, DATETIME, DATE)를 JavaScript Date 객체로 확장하지 않고 String으로 반환하도록 강제.true /false 또는 String으로 받을 type name들의 array 가능. | false | true 로 설정하여 date type들을 JavaScript Date 객체로 받지 않고 String으로 받기 |
// get the client
const mysql = require('mysql2');
// create the connection to database
const connection = mysql.createConnection({
// host: 'localhost',
// port: 3306,
user: 'root',
password: 'root',
timezone: 'Asia/Seoul',
database: 'Youtube',
dateStrings: true
});
// simple query
connection.query(
'SELECT * FROM `users`',
function (err, results, fields) {
let { id, email, name, created_at } = results[0];
console.log(id);
console.log(email);
console.log(name);
console.log(created_at);
}
);
잘 출력됨!
1
kim@mail.com
김서형
2023-12-20 19:16:32