728x90

Math.abs()

Math.abs()는 주어진 숫자의 절대값을 반환한다.

빈 객체, 하나 이상의 요소를 가진 배열, 숫자가 아닌 문자열, undefined나 빈 매개변수를 받으면 NaN을 반환.

null, 빈 문자열이나 빈 배열을 제공하면 0을 반환.

Math.abs(x);

 

Math.abs() 예제

Math.abs('-1');     // 1
Math.abs(-2);       // 2
Math.abs(null);     // 0
Math.abs('');       // 0
Math.abs([]);       // 0
Math.abs([2]);      // 2
Math.abs([1,2]);    // NaN
Math.abs({});       // NaN
Math.abs('string'); // NaN
Math.abs();         // NaN

 

728x90
728x90

toUpperCase()

toUpperCase()는 문자열을 대문자로 반환한 값을 반환.

 

toUpperCase() 예제

let text = 'abcd';

console.og(text.toUpperCase()); // 'ABCD'

 

toLowerCase()

toLowerCase()는 문자열을 소문자로 반환한 값을 반환.

 

toLowerCase() 예제

let text = 'ABCD';

console.log(text.toLowerCase()); // 'abcd'
728x90
728x90

trim()

문자열의 양끝의 공백을 제거한 문자열을 반환.

문자열에 공백이 없어도 예외가 발생하지 않고 새 문자열이 반환.

한쪽 끝의 공백만 제거한 문자열을 반환하려면 trimStart() 또는 trimEnd()를 사용.

 

trim() 예제

let text = '   text   ';

console.log(text.trim()); // 'text'

console.log(text.trimStart()); // 'text   '

console.log(text.trimEnd()); // '   text'

 

728x90
728x90

EXPLAIN

SELECT문을 수행하는 방법에 대해 정보를 얻기 위한 수단.

EXPLAIN SELECT * FROM TABLE_NAME

 

EXPLAIN 결과

id: 1 
select_type: SIMPLE 
table: TABLE_NAME 
type: ALL 
possible_keys: NULL 
key: NULL 
key_len: NULL 
ref: NULL 
rows: 1
Extra: NULL
  • id : 쿼리 안에 있는 각 select 문에 대한 순차 식별자. 이순서대로 select문이 실행된다고 생각하면 된다.
  • select_type : select 문의 유형.
    • SIMPLE : 서브쿼리나 'union'이 없는 가장 단순한 select문.
    • PRIMARY : 가장 바깥에 있는 select문.
    • DERIVED : from 문 안에있는 서브쿼리의 select문.
    • SUBQUERY : 가장 바깥의 select 문에 있는 서브쿼리.
    • DEPENDENT SUBQUERY : 기본적으로 SUBQUERY와 같은 유형, 가장 바깥 select문에 의존성을 가진 서브쿼리.
    • UNION : union 문의 두번째 select문.
    • DEPENDENT UNION : 바깥 쿼리에 의존성을 가진 union문의 두번째 select문.
  • table : 참조되는 테이블.
  • type : MySQL이 어떤식으로 테이블들을 조인하는지를 나타내는 항목. 이는 매우 중요한데, 이 타입을 분석함으로써 어떤 인덱스가 사용여부를 알 수 있고, 어떤식으로 쿼리가 튜닝되어야하는지에 대한 insight를 제공하기 때문.
    • system : 0개 또는 하나의 row를 가진 테이블.
    • const : 테이블에 조건을 만족하는 레코드가 하나일 때, 상수 취급
    • eq_ref : primary key나 unique not null column으로 생성된 인덱스를 사용해 조인을 하는 경우.  const 방식 다음으로 빠른 방법.
    • ref : 인덱스로 지정된 컬럼끼리의 '=' , '<=>' 와 같은 연산자를 통한 비교로 수행되는 조인이다
    • index_merge : 2개 이상의 인덱스를 이용해 각각의 검색 결과를 만들어낸 후에 그 결과를 병합하는 처리 방식
    • unique_subquery : 오직 하나의 결과만을 반환하는 'IN'이 포함된 서브쿼리의 경우이다.
    • index_subquery : unique_subquery와 비슷하지만 여러개의 결과를 반환한다
    • range : 특정한 범위의 rows들을 매칭시키는데 인덱스가 사용된 경우이다. BETWEEN이나 IN, '>', '>=' 등이 사용될 때이다.
    • all : 조인시에 모든 테이블의 모든 row를 스캔하는경우이다. 물론 성능이 가장 좋지 않다.
  • possible_keys : 테이블에서 row를 매핑시키기 위해 사용 가능한 (사용하지 않더라도) 키를 보여준다.  
  • key : 실제 쿼리 실행에 사용된 key 목록. 이 항목에는 possible_keys 목록에 나타지 않은 인덱스도 포함 될 수 있다.
  • ref : key column에 지정된 인덱스와 비교되는 column 또는 constants를 보여준다.
  • rows : 결과 산출에 있어서 접근되는 record의 숫자. 조인문이나 서브쿼리 최적화에 있어서 중요한 항목.
  • Extra : 실행계획에 있어서 부가적인 정보를 보여준다.
    • distinct : 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음.
    • not exist : left join 조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 검사하지 않는다.
    • range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미.
    • using filesort : mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다.
    • using index : select 할때 인덱스 파일만 사용
    • using temporary : 임시 테이블을 사용. order by 나 group by 할때 주로 사용
    • using where : 조건을 사용한다는 의미.
 

 

728x90
728x90

CONCAT()

CONCAT()은 둘 이상의 문자열이나 컬럼 값을 순서대로 합쳐서 반환해 주는 함수.

단, 합쳐지는 문자열이나 컬럼값이 NULL을 포함한다면 반환되는 값도 NULL.

 

SELECT CONCAT(문자열1, 문자열2 [, 문자열3 ...]) FROM 테이블명

 

CONCAT() 예제

SELECT CONCAT('AA','BBB',' ','CCC','DD') FROM TABLE_NAME;
SELECT CONCAT('999','.','111') FROM DUAL;
SELECT CONCAT('AA','BBB',NULL,'CCC','DD') FROM TABLE_NAME;

#AABBB CCCDD
#999.111
#NULL

 

CONCAT_WS()

CONCAT_WS()는 둘 이상의 문자열이나 컬럼 값을 반복되는 구분자를 넣고 순서대로 합쳐서 반환해 주는 함수.

CONCAT()와는 다르게 NULL을 포함하여도 NULL로 반환하지 않는다.

 

SELECT CONCAT_WS(구분자, 문자열1 [, 문자열2, 문자열3 ...]) FROM 테이블명

 

CONCAT_WS() 예제

SELECT CONCAT_WS(',','AA','BBB','CCC','DD') FROM DUAL;
SELECT CONCAT_WS(',','AA','BBB',NULL,'CCC','DD') FROM DUAL;
SELECT CONCAT_WS(',','111','222','333') FROM DUAL;

#AA,BBB,CCC,DD
#AA,BBB,CCC,DD
#111,222,333
728x90
728x90

더미데이터를 삽입하는 프로시저 생성

다량의 데이터를 조회하는 쿼리의 속도 개선을 위해 더미데이터를 만들어야 했다.

검색 결과 프로시저를 생성하여 더미데이터를 삽입할 수 있었다.

 

DELIMITER $$
DROP PROCEDURE IF EXISTS loopInsert$$
 
CREATE PROCEDURE loopInsert()
BEGIN
    DECLARE i INT DEFAULT 1;
        
    WHILE i <= 10000 DO
        INSERT INTO FREQBANDINFO(fb_masterkey , fb_datetime, fb_freq , fb_th_level , fb_ch_level)
          VALUES('20211025112428205', now(), '2399000064', '-128.5', '-128.5');
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER $$

 

프로시저 실행

CALL loopInsert;

 

주의

멍청하게 1000만개를 한번에 넣었다가 한나절 걸렸다 천천히 테스트하면서 해볼것.

 

728x90
728x90

원인

외부에서 DB 접속 시도시 나는 에러.

보안상 root 계정에 아무나 접근 할 수 없기에 허용할 IP를 지정해야 한다.

 

모든 IP 허용

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '패스워드';

 

특정 IP 허용

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.254' IDENTIFIED BY '패스워드';

 

특정 IP 대역대 허용

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0.%' IDENTIFIED BY '패스워드';

 

IP 허용 후 원상태로 복구

DELETE FROM mysql.user WHERE Host='%' AND User='아이디';
FLUSH PRIVILEGES;

 

서버 구축 시 실제로 일어났었으니 까먹지 말자.

728x90
728x90

2022년 글로벌 웹 서버 시장 점유율

 

 

과거에는 Apache가 압도적인 점유율을 차지.

하지만 2022년 현재 글로벌 점유율을 보면 Nginx가 상당히 많이 치고 올라왔다.

 

Nginx

  • 비동기 Event-Driven 기반 구조.
  • 다수의 연결을 효과적으로 처리 가능.
  • 대부분의 코어 모듈이 Apache보다 적은 리소스로 빠르게 동작 가능.
  • 작은 쓰레드로 클러이언트의 요청 처리 가능

 

Nginx Event-Driven 방식

Nginx의 Event-Driven 방식

Apache의 C10K(한 시스템에 동시 접속자수가 1만명이 넘어갈 때 효율적방안) 문제점을 보완한다.

 

Apache

  • 쓰레드 / 프로세스 기반 구조로 한개의 요청을 쓰레드 하나가 처리하는 구조
  • 사용자가 많으면 많은 쓰레드 생성, 메모리 및 CPU 낭비가 심함
  • 하나의 쓰레드 = 하나의 클라이언트

 

Apache 쓰레드 방식

Apache의 Thread 방식

요청이 많을수록 쓰레드를 생성하므로 CPU와 메모리 사용이 증가하기 때문에 성능 저하가 있을 수 있다.

 

Apache & Nginx 장점

  • Apache는 Nginx 에 비해 모듈이 다양하다.
  • Apache는 안정성, 확장성, 호환성을 장점으로 들자면, Nginx 는 성능이 우세하다는 장점이 있다.
728x90

'etc' 카테고리의 다른 글

라이엇 api 승인 완료  (0) 2022.08.17
라이엇 api 신청 방법(롤 api)  (0) 2022.08.01
ASCII Code 아스키 코드란?  (0) 2022.02.24
JSON이란  (0) 2022.02.05

+ Recent posts