라벨이 mysql인 게시물 표시

docker-compose php, mysql을 Dockerfile, docker-compose.yaml을 이용하여 서버 구성하기

이미지
파일구성 src폴더 안에는 php파일들이 들어갑니다.  mysql.php 코드 <!-- ./src/mysql.php --> <?php $env = parse_ini_file ( '../.env' ); // env파일 경로를 확인해서 key, value로 저장 $host = $env [ "MYSQL_HOST" ]; // MySQL 연결 주소 $username = $env [ "MYSQL_USERNAME" ]; // MySQL 사용자 이름 $password = $env [ "MYSQL_PASSWORD" ]; // MySQL 사용자 비밀번호 $dbname = $env [ "MYSQL_DATABASE" ]; // 데이터베이스 이름 $dbport = $env [ "MYSQL_PORT" ]; // 데이터베이스 포트 // MySQL에 연결 $conn = new mysqli ( $host , $username , $password , $dbname , $dbport ); // 연결 확인 if ( $conn -> connect_error ) { die ( "Connection failed: " . $conn -> connect_error ); } echo "Connected successfully" ; // 연결 종료 $conn -> close (); ? > Dockerfile 파일 # ./Dockerfile # PHP Docker 공식 문서 : https://hub.docker.com/_/php # PHP 이미지를 사용합니다. 버전은 필요에 따라 조정할 수 있습니다. FROM php : 8.2-cli # PHP의 mysqli을 사용하기 위한 extension을 설치 RUN docker-php-ext-install mysqli && doc...

Docker-Compose yaml파일을 이용하여 MySQL를 Local로 구축하기

이미지
사전에 Docker및 Docker-Compose가 설치되어 있어야 합니다. mysql official docker image link : https://hub.docker.com/_/mysql docker-compose로 컨테이너를 만들기전 .yaml파일을 작성합니다. # ./docker-compose.yaml # services에서는 여러개의 컨테이너를 생성할수 있습니다. # 참고 링크 : https://hub.docker.com/_/mysql services : mysql : # 컨테이너의 베이스가 될 이미지를 받는다(현재 docker-compose.yaml은 mysql 8.2.0버전을 사용한다.) image : mysql:8.2.0 volumes : # mysql의 데이터의 초기화를 방지하기 위해 볼륨으로 저장한다. - mysql_data:/var/lib/mysql env_file : # yaml의 상대경로로 환경변수 파일을 찾는다. - ./.mysql.env ports : # 외부에 포트를 노출시킨다. mysql의 default포트는 3306이고 4500포트로 외부에 노출시킨다. - "4500:3306" # 네이밍 볼륨이 있을시 반드시 루트에 한번더 volumes 안에 해당 네이밍 볼륨 이름을 넣는다. volumes : # mysql은 mysql_data라는 네이밍 볼륨을 사용하기 때문에 아래에 추가해준다. mysql_data : docker-compose.yaml과 같은 경로에 .mysql.env파일 안에는 아래와 같이 유저 이름과 비밀번호를 작성하고 저장합니다. # MySQL 루트 비밀번호 MYSQL_ROOT_PASSWORD=password # MySQL 사용자 계정(선택) MYSQL_USER=alex # MySQL 사용자 비밀번호(선택) MYSQL_PASSWORD=password # MySQL 타임존 셋팅(선택). 설정하지 않을시 UTC시간으로 설정....

DBMS MySQL - SQL8-4: 인덱스 SQL 사용하기

이미지
 안녕하세요. 알렉스 입니다. 이번에는 8-1 ~ 8-3까지 배운 이론을 실제 MySQL에 적용해 보도록 하겠습니다. 해당 테이블의 인덱스 상태를 확인합니다. $ SHOW INDEX FROM [Table Name] copy 사진1) 테이블 생성후 인덱스 확인 사진1에서 테이블 을 생성할때 col1은 PRIMARY, col2는 UNIQUE로 지정하였습니다. 사진1에서 나온 인덱스 결과는 col1, col2만 나왔는데 col3는 아무것도 지정하지 않았기 때문입니다.   여기서 col1은 PRIMARY KEY(클러스터형 인덱스)이고 col2는 보조 인덱스 입니다. 사진2) 테이블 Record 생성 사진2에서 테이블의 Record를 생성할때 col1은 순서없이 INSERT하였습니다. 하지만 SELECT 구문을 사용하여 출력할때는 정렬이 되 있는것을 알수 있습니다. 이렇든 PRIMARY로 지정이 되면 MySQL에서 자동 정렬을 수행합니다.   그러나 Record수가 적을때는 쉽게 하지만 만약 Record수가 수만, 수십만이게 되면 DB입장에서 PRIMARY키를 정렬하는데도 상당한 시간이 걸립니다. 따라서 PRIMARY키는 Record가 없는 초기때 생성하는 것이 성능향상에 도움이 많이 됩니다. 사진3) 고유보조인덱스 생성 컬럼에 고유인덱스 생성 $ CREATE UNIQUE INDEX [Key_name] ON [Table Name] ([Column Name]) copy 사진4) 인덱스 삭제 컬럼에 인덱스 삭제(컬럼삭제가 아님) $ DROP INDEX [Key_name] ON [Table Name] copy 사진5) 보조인덱스 추가 사진5에서 인덱스를 설정했음에도 되지 않는 이유는 해당 테이블을 분석하지 않았기 때문입니다.  컬럼에 인덱스(중복가능) 생성 $ CREATE INDEX [Key_name] ON [Table Name] ([Column Name]) copy 해당 테이블의...

DBMS MySQL - SQL8-3: 인덱스 사용시 악영향(INSERT, UPDATE, DELETE)

이미지
 균형트리구조를 이용하여 조회를 할때 속도면에서 많은 이득이 있었습니다. 하지만 삽입, 수정, 삭제를 할시 DB의 성능에 영향을 줄수 있습니다.  사진1) 이전 글에서 사용한 균형트리 이제 사진1에서 저는 210, 211, 212를 추가하고 싶습니다. 그러면 일단 아래와 같이 추가를 할수 있습니다. 사진2) 210, 211, 212추가 사진2와 같이 3개의 데이터를 추가했는데 200페이지에 지나치게 많은 데이터가 몰렸습니다. 그럼 이때 중간의 페이지를 늘려줘야 합니다. 사진3) 트리구조 변경  사진3처럼 효율적으로 데이터를 찾기 위해 트리 구조가 변경 되었습니다. 210 ~ 212를 쉽게 찾기 위해 중간에 211 페이지가 추가 되었고 200 ~ 211에는 210이 211 ~ 224에는 211, 212가 배정되었습니다.   이렇듯 INSERT를 하게 되면 트리구조의 변경이 생기기 때문에 성능에 문제가 생길수 있습니다. 이는 UPDATE나 DELETE도 마찬가지 입니다. 데이터가 변경이 되면 인덱스는 검색하기 효율적인 방법으로 구조를 재편하게 됩니다. 하지만 인덱스량이 많으면 그만큼 시간이 걸립니다.  이전글 :  DBMS MySQL - SQL8-2: 인덱스 내부 동작 원리 이후글 :  DBMS MySQL - SQL8-4: 인덱스 SQL 사용하기

DBMS MySQL - SQL8-2: 인덱스 내부 동작 원리

이미지
 MySQL의 클러스트형과 보조형 인덱스는 균형트리로 만들어집니다. 이는 자료구조 내용에서 나오는 데이터 구조 입니다.  사진1) 균형트리 구조  사진1의 균형트리 구조가 나무를 거꾸루 세온 것이라고 할수 있습니다. 위쪽은 시작지점인 뿌리가 있고 다음 중간이 있고 다음 잎은 피라미드처럼 넓어 집니다.  그럼 간단하게 균형트리에 대해서 표로 그려보도록 하겠습니다. 사진2) 균형트리 구조(표)  사진2에서는 3단계로 균형트리를 구성하였습니다. 가장 위쪽에는 100, 200, 300이 있고 그 밑으로 숫자가 규칙적으로 나열되 있는 것을 알수 있습니다. 이때 저는 232의 숫자 데이터를 알고 싶습니다. 이때 MySQL에서 어떤식으로 검색하는지 알아보겠습니다. 사진3) 루트에서 200선택  처음 232의 데이터를 찾을때 루트에서 3개의 선택지가 있습니다. 그런데 232 > 200 AND 232 < 300이기 때문에 200 페이지에 있다는 것을 알수 있습니다. 사진4) 중간에서 225 선택 이제 중간도 마찬가지로 232 > 225 AND 232 < 250이기 때문에 232페이지를 선택합니다.  사진5) 232조회 완료  이제 225페이지에서 순서대로 조회하면 232를 찾을수 있습니다. 만약 인덱스를 사용하지 않으면 100번부터 232번까지 133번을 조회해야 하지만 균형트리 구조를 사용하면 4번만에 찾을수 있습니다. 균형트리는 조회하는데 속도에 도움을 많이 주지만 INSERT, DELETE, UPDATE할시 성능에 악영향을 줄수 있습니다.  악영향에 대해서는 다음 글에서 설명 드리도록 하겠습니다. 이전글 :  DBMS MySQL - SQL8-1: 인덱스 개념 이후글 :  DBMS MySQL - SQL8-3: 인덱스 사용시 악영향(INSERT, UPDATE, DELETE)

DBMS MySQL - SQL8-1: 인덱스 개념

이미지
 안녕하세요. 알렉스 입니다. 이번에는 DBMS에서 인덱스에 대해서 글을 작성하도록 하겠습니다. 이번 글에서는 기본적인 인덱스에 대한 개념을 설명하고 다음 글에서는 실제 MySQL에서 인덱스를 이용하여 정렬및 검색을 하는지 알아보겠습니다. 사진1) 인덱스 예시  인덱스는 일종에 검색을 편하기 위한  '찾아보기'로 생각하시면 됩니다. 만약 인덱스가 없다면 특정 정보를 찾기 위해서 책을 처음부터 끝까지 찾아봐야 합니다. 만약 검색 정보가 맨 앞에 있으면 금방 찾지만 가장 뒤에 있으면 가장 오랜 시간이 걸립니다.  설사 인덱스를 만든다 하더라도 인덱스 사용유무는 MySQL에서 판단합니다. 만약 인덱스를 사용하지 않는다면 DB성능을 위해서 인덱스를 제거하는 것이 좋습니다. 사진2) DB와 통신  인덱스를 이용하여 DB를 조회하면 빠르게 검색이 가능합니다. 하지만 인덱스가 많아지게 되면 DB성능에 문제가 생길수 있습니다.  사진3) 클러스터형과 보조 인덱스  MySQL에서 인덱스를 크게 클러스터형과 보조형 인덱스로 나눌수 있습니다. 클러스터형 인덱스는 사전과 비슷합니다. 그리고 한개의 Table에서 column 하나만 생성할수 있습니다. 클러스터형 인덱스를 생성하면 해당 컬럼은 자동으로 정렬이 됩니다.  반면 보조 인덱스는 일종의 색인과 같습니다. 따라서 클러스터형 인덱스처럼 자동으로 정렬하지 않습니다. 하지만 검색시 도움을 줍니다. 하지만 인덱스는 DB의 성능에 영향을 줄수 있습니다. 인덱스는 테이블의 약 10%의 데이터 공간을 차지하고 기존의 테이블에 인덱스를 생성할시 시간이 걸립니다. 특히 SELECT(조회)외 INSERT, UPDATE, DELETE를 자주 하게 되면 성능이 나빠집니다. 이는 다음 글에서 설명하도록 하겠습니다. 이후글 :  DBMS MySQL - SQL8-2: 인덱스 내부 동작 원리

DBMS MySQL - SQL7: MIN, MAX 최대, 최소 및 중복 쿼리문 사용하기(2개이상)

이미지
DBMS MySQL - SQL6 : UPDATE MANY -> 여러개의 레코드를 한 쿼리에 UPDATE하기  안녕하세요. 알렉스입니다. 이번에는 SQL문을 이용하여 최대값과 최소값, 그리고 2개이상의 중복 쿼리를 사용해 보도록 하겠습니다. 1. MIN, MAX MIN은 최소값, MAX은 최대값을 찾습니다. 위 쿼리를 사용하면 해당 Column에서 최대 혹은 최소값을 찾습니다. $ SELECT MIN([Column Name]) FROM [Table Name];  copy 2. 중복 쿼리  중복 쿼리는 SQL안에 또 다른 SQL이 있는 것입니다. 내부의 SQL을 먼저 실행하고 끝나고 나면 바깥쪽의 SQL문이 실행이 됩니다. $ SELECT [Column Name1], [Column Name2] FROM books WHERE [Column Name3]=([SQL]); copy 문제는 더블 SQL을 하용하게 되면 DB에 부하를 주게 되어 있습니다. 따라서 중복 SQL을 사용하기 보다는 가능한 하나의 SQL문으로 사용하는 것이 효율에 좋습니다.

DBMS MySQL - SQL6 : UPDATE MANY -> 여러개의 레코드를 한 쿼리에 UPDATE하기

이미지
이전글 : DBMS MySQL - SQL5 : GROUP BY 레코드를 그룹으로 묶기  안녕하세요. 알렉스입니다. 이번에는 SQL문을 이용하여 하나의 쿼리로 여러개의 Record를 업데이트 하도록 하겠습니다. 1. 기존 UPDATE 기존의 UPDATE는 WHERE을 이용하여 검색한 다음에 SET을 이용하여 Value를 UPDATE하는 방식 이였습니다. 아래 링크 참조 링크 : DBMS MySQL - SQL2 : UPDATE, SUBSTRING, REPLACE 하지만 여러개의 레코드를 한 쿼리안에 UPDATE를 할려면 다른 쿼리를 이용해야 합니다. 2. 여러개의 Query로 Record 업데이트 $ INSERT INTO [table name]([column name1], [column name2], [column name3]) VALUES ([value1-1], [value1-2], [value1-3]), ([value2-1], [value2-2], [value2-3]) ON DUPLICATE KEY UPDATE  [column name1]=VALUES([column name1]), [column name2]=VALUES([column name2]);   copy 사진1) 여러 Record Update 사진1에서 INSERT를 쓴것을 알수 있습니다. 하지만 'ON DUPLICATE KEY UPDATE'를 삽입하여 중복되는 key에 대해서 UPDATE를 하도록 하였습니다. 이 방법을 이용하면 UPDATE을 하기 위해서 DB에 불필요한 요청을 보낼 필요가 없습니다. 다음글 : DBMS MySQL - SQL7: MIN, MAX 최대, 최소 및 중복 쿼리문 사용하기(2개이상) 

DBMS MySQL - SQL5 : GROUP BY 레코드를 그룹으로 묶기

이미지
이전글 :DBMS MySQL - SQL4 : LIMIT, LIKE -> 조회수 제한 및 키워드로 DB조회하기   안녕하세요. 알렉스입니다. 이번에는 SQL문을 이용하여 레코드를 그룹으로 만들고 그것을 사용하는 것에 대해서 알아보겠습니다. 1. GROUP BY 'GROUP BY'는 컬럼내에서 같은 레코드가 있을때 그것을 묶어줍니다. GROUP BY는 ORDER BY 처럼 단독으로 사용될수 없고 다른 sql구문들과 갖이 사용해댜 합니다. 일단 간단한 그룹을 설정하고 그 그룹에 있는 레코드의 개수를 새 보도록 하겠습니다. $ SELECT COUNT(*), [Column Name1] FROM [Table Name] GROUP BY [Column Name1] [Column Name1]과 각각 일치하는 레코드의 수를 구한다. copy 사진1) GROUP로 조회 하지만 GROUP BY로 조회할시 오류가 나는 경우가 있습니다.  사진2) GROUP BY 오류 사진2에서는 모든 컬럼을 갖고 똑같이 released_year로 GROUP BY를 할려고 했습니다. 하지만 MySQL에서 거부를 했습니다. 이유는 id컬럼 때분입니다. id는 각각의 레코드마다 다 다르기 때문에 하나로 합칠수가 없습니다. 사진1에서는 COUNT를 이용하여 수량을 셋기 때문에 상관 없지만 GROUP BY로 나타낼때는 동일해야 합니다.

DBMS MySQL - SQL4 : LIMIT, LIKE -> 조회수 제한 및 키워드로 DB조회하기

이미지
이전글 : DBMS MySQL - SQL3 : ORDER BY 결과 정렬하기  안녕하세요. 알렉스입니다. 이번에는 SQL문을 이용하여 조회수를 제한하거나 검색을 해보도록 하겠습니다. 1. LIMIT 'LIMIT'는 기타이유로 모든 결과가 아닌 제한된 조회수를 출력합니다. 예로 들어 날짜별로 100개의 데이터가 있는데 그중에 상위 3개만 보고 싶으면 LIMIT를 사용합니다. $ SELECT [Column Name] FROM [Table Name] LIMIT [Limit Number] 조회되는 Record의 수를 제한한다. copy 사진1) Limit사용 후 출력 하지만 LIMIT는 숫자만 입력되지는 않습니다. 인자 2개를 입력하면 자동으로 해당 Record를 설정한 숫자만큼 출력할수 있습니다.(skip:무시할 Record수, take : 무시할 레코드 다음으로 조회할 수) $ SELECT [Column Name] FROM [Table Name] LIMIT [skip],[take] copy 사진2) Skip, Take사용 후 출력 사진2를 보면 skip는 1이기 때문에 book_id가 1인 레코드를 무시하게 되었습니다. 만약 skip가 0이면 사진1과 동일할 것입니다. 이후 take에서 3을 입력했기 때문에 3개의 레코드가 출력된 것입니다. 2. LIKE LIKE키워드는 해당 Column을 검색하기 위해서 사용합니다. 기존에 사용한 "WHERE id='123'"같이 id가 123과 완전히 일치해야 찾는 것이 아닌 부분적으로 일치해도 찾을수 있게 도와줍니다. 이따 사용하는 키워드가 '%'입니다. $ SELECT [Column Name] FROM [Table Name] WHERE [Column Name] LIKE'[[keyword]%]' copy 사진3)Like사용 하지만 이때 조회된 Record는 앞단이 'wh'인 것들 입니다. 만약 뒤쪽의 키...

DBMS MySQL - SQL3 : ORDER BY 결과 정렬하기, DESC(DESCRIBE)로 테이블 정보 알아보기

이미지
 안녕하세요. 알렉스 입니다. 저번에 이어서 DBMS의 MySQL의 SQL문에 대해서 작성하겠습니다. 이전 글 : 링크 'ORDER BY'는 말 그대로 출력하는 결과를 정렬(Sorting)해주는 기준 입니다. 기본은 오름차순으로 셋팅 되어 있고 내림차순으로도 할수 있습니다. 1. ORDER BY 오름차순 지정한 컬럼을 기준으로 오름차순 정렬을 합니다. $ SELECT [Column Name] FROM [Table Name] ORDER BY [Column Name1], [Column Name2] $ 1개 이상의 컬럼을 정렬하게 되면 첫번째 컬럼이 정렬된 다음 두번째 컬럼으로 정렬하게 된다. copy 2. ORDER BY 내림차순 지정한 컬럼을 기준으로 내림차순 정렬을 합니다. $ SELECT [Column Name] FROM [Table Name] ORDER BY [Column Name1], [Column Name2] ... DESC $ 1개 이상의 컬럼을 정렬하게 되면 첫번째 컬럼이 정렬된 다음 두번째 컬럼으로 정렬하게 된다. copy 사진2) publish기준으로 내림차순 위의 사진처럼 기준을 1개로 잡을수도 있도 2개 이상으로 잡을수도 있습니다. 이때 왼쪽에 있는 컬럼을 기준으로 순차척으로 ORDER BY가 적용이 됩니다. 3. DESC or DESCRIBE를 이용하여 테이블 정보를 알아보기 DESC or DESCRIB를 이용하여 대략적인 테이블 정보를 보여줍니다. $ DESC [Table Name] copy 해당 테이블이 작성된 쿼리문을 보여줍니다. $ SHOW CREATE TABLE [Table Name] copy 다음글 : DBMS MySQL - SQL4 : LIMIT, LIKE -> 조회수 제한 및 키워드로 DB조회하기

DBMS MySQL - SQL2 : UPDATE, SUBSTRING, REPLACE

이미지
 안녕하세요. 알렉스 입니다. 저번에 이어서 DBMS의 MySQL의 SQL문에 대해서 작성하겠습니다. 이전 글 : 링크 1. Record Update DataBase에 있는 Table의 Record를 수정(UPDATE)합니다. $ UPDATE [Table] SET [Column1 Name] = [Value1], [Column2 Name] = [Value2] WHERE [UPDATE Column Name] = [Value]; copy 사진1) publish날짜 Update 2. 문자열 자르기 : SUBSTRING Column에서 문자열을 잘라냅니다. $ SELECT SUBSTRING([Column Name], [시작 인덱스], [마지막 인덱스]) FROM [Table Name]; copy 사진2) name컬럼에서 1~5자리만 남김 SUBSTRING은 단독으로 사용이 가능합니다. $ SELECT SUBSTRING([String], [시작 인덱스], [마지막 인덱스]) copy 사진3) 'Hello World' 잘라내기 3. Table안에 Record를 REPLACE하기 선택한 Table Column의 Record의 문자열을 대체합니다. $ SELECT REPLACE([Column Name], [검색 문자열], [대체 문자열]) FROM [Table Name]; copy 사진4) 'e'를 'fffff'으로 REPLACE REPLACE은 단독으로 사용이 가능합니다. $ SELECT REPLACE([Column Name], [검색 문자열], [대체 문자열]) copy 사진5) 문자열만 변환(Replace)

DBMS MySQL - SQL1 : DATABASE, TABLE, INSERT

이미지
 안녕하세요. 알렉스 입니다. 이번에는 시리즈별로 DBMS의 MySQL의 SQL문에 대해서 블로그 글을 작성할려고 합니다. 가장먼저 DB생성, Table생성 그리고 레코드 삽입으로 먼저 진행을 하도록 하겠습니다. 1. DB생성 MySQL에 DataBase를 생성합니다. $ CREATE DATABASE [DATABASE이름]; copy 사진1) DB생성 DataBase을 생성하기 위한 명령어 입니다. 해당 DataBase의 이름이 같은 MySQL안에서 중복이 되면 안됩니다. 2. Table생성 MySQL에서 DataBase을 조회합니다. $ SHOW DATABASES [DATABASE이름]; copy 사진2) DataBase조회 MySQL에서 DataBase을 선택합니다. $ USE [DATABASE이름]; copy 사진3) DataBase 선택 선택한 DataBase안에서 Table을 생성합니다. $ CREATE TABLE [Table 이름] ([Column1 이름] [Column1 속성], [Column2 이름] [Column2 속성], [Column3 이름] [Column3 속성], [.....]); copy 사진4) DataBase에서 Table생성 테이블에 들어가는 Column속성은 MySQL공식 문서에서 확인할수 있습니다.( Link ) 3. Table안에 Record를 INSERT하기 선택한 Table안에 Record를 생성합니다. $ INSERT INTO [Table 이름] ([Column1 이름],[Column2 이름],[Column3 이름], [...]) VALUES([Column1에 해당하는 Value], [Column2에 해당하는 Value], [Column3에 해당하는 Value], [....]) ([Column1에 해당하는 Value], [Column2에 해당하는 Value], [Column3에 해당하는 Value], [....]); copy 사진5) Table에 Recor...