묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Real MySQL 시즌 1 - Part 1
1강 CHAR타입에 대해 질문드립니다
안녕하세요. 우선 이렇게 좋은 강의 해주셔서 감사합니다. 강의를 듣다가 궁금한 부분이 있어 질문드립니다.Q1) 10:00분 경에 "CHAR여도 utf8mb4같은 가변길이 캐릭터 셋을 사용하면 때로는 예약된 빈 공간이 없을 수 있다"라고 말씀해 주셨는데요. 제가 강의를 듣고 이해하기로는 '1~4byte값을 가질 수 있다는 가변길이 캐릭터 셋' 성질 때문이 아니라 '문자 하나당 크기가 1byte를 초과했기 때문에' 예약된 빈 공간이 없어지는 걸로 생각했습니다. 즉, 가변길이 캐릭터 셋인 utf8mb4가 아닌 하나당 크기가 3byte인 어떤 고정길이 캐릭터 셋을 이용하더라도 동일하게 예약된 빈 공간이 없을꺼 같은데 혹시 제가 이해한게 맞을까요?Q2) 마지막 내용 정리하시는 부분에서 "인덱스된 컬럼이라면 CHAR가 효율적일 가능성이 더 높다"고 말씀해 주셨는데 어떤 이유로 인덱스된 컬럼에 CHAR가 더 좋을 가능성이 높은건지 알려주실 수 있으실까요?
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Cacheable key값 설정에서 null
@Cacheable(cacheNames = "getBoards", key = "'boards:page:' + #page + ':size:' + #size", cacheManager = "boardCacheManager") public List<Board> getBoards(int page, int size) { Pageable pageable = PageRequest.of(page - 1, size); Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable); return pageOfBoards.getContent(); } }여기서 key = "'boards:page:' + #page + ':size:' + #size"레디스에 저장되는 키값은 "getBoards::boards:page:null:size:null" 이렇게 저장이 됩니다. 혹시 null이 들어가는 이유가 있을까요? page와 size의 데이터도 잘 넘어오고 레디스에서 저 키값으로 조회를 하면 안에 데이터는 잘 들어가 있습니다. #page와 #size가 null인 이유가 있을까요?
-
해결됨Real MySQL 시즌 1 - Part 2
시퀸셜하게 증가하지 않는 PK의 insert성능도 문제가 있을까요?
좋은 강의 제공해주셔서 감사합니다!강의를 듣다보니 의문점이 하나 생겼는데요. 에피소드 14의 시퀸셜하지 않은 UUID사용시 범위 검색의 조회 효율성 문제를 언급해주셨는데요 데이터 삽입시 인덱스가 리밸런싱되거나 리프노드의 실제 데이터 위치가 이동하는 문제가 발생할수도 있을까요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
파라미터에 있는 값이 아닌 외부에 있는 값을 캐시 key에 넣을 수 있나요?
파라미터에 있는 값이 아닌 외부에 있는 값을 캐시 key에 넣을 수 있나요?
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
CacheManager 는 한 번만 등록하나요? 아니면 각 도메인마다 등록하나요?
안녕하세요, 좋은 강의 감사합니다. Spring Boot 에서 Redis 세팅 추가하는 편에서, CacheManager 를 하나만 등록해서 사용하고 있습니다. 그리고 이를 활용하는 API 가 1개 뿐인데, 이름이 boardCacheManager 로 정확히 Board 도메인에 대한 전용 CacheManager 인 것처럼 보입니다. 도메인 별로 CachaManager 를 각각 만들면서 사용을 하는 게 좀 더 바람직한 방법인가요?만약 그렇다면, 각 도메인 별로 설정을 관리하고 유지보수성을 높이기 위함인가요?만약 CachaManager 를 도메인 별로 값이나 타입을 다르게 적용하지 않고 프로젝트 전체에 대해서 동일하게 적용을 하기로 결정했다면, 그때에도 CacheManager 를 각각 적용해야 할 이유가 혹시 있을까요? 인터넷 기사나 블로그 등에서는 이렇게도 하고 저렇게도 하는 것 같습니다. 선생님의 의견이나 또 실무 상의 고려사항이 있는지 궁금합니다.
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
windows 에서 설치하는 분들, Permission denied 에러가 나는 경우 참고해주세요
windows 실습 환경에서 admin 계정이 아닌 경우에는 기본적으로 .rdb 파일에 대한 권한이 읽기만 설정되어 있는 것 같습니다.그런데, redis 자체가 .rdb 에 대한 snapshot 생성을 시도하려고 하는데 이때 쓰기 권한이 없어서 예외를 발생시킵니다. 처음 실습할 때는 (어차피 본격적으로 쓰는 건 Linux 에서 쓸 거라고 생각하고)무시하다가, 이후에 Spring Boot Project 실습할 때 같은 이유로 캐싱 자체가 안 되는 현상이 있었습니다.따라서 무시할 게 아니라 쓰기 권한을 부여해야 합니다. 관련된 내용을 사진 첨부드리니 참고 부탁드립니다.또한 해당 내용은 windows 에서 설치하고 PING 으로 확인할 때부터 나타나는 현상이므로, 혹시라도 제안드리자면 노션의 redis 설치 가이드 페이지에서 권한 문제 트러블슈팅으로 추가로 적어주시면 공유하기에 좋을 듯 합니다. Mac 은 잘 모르겠습니다...ㅎㅎdump.rdb 등 .rdb 확장자 파일에서 우클릭 후 속성 클릭 [보안] 탭으로 이동한 후 편집 클릭(현재 사용 중인 계정을 클릭하면 현재 부여된 사용 권한도 확인 가능)현재 사용 중인 계정을 찾아서 사용 권한에 수정과 쓰기 등등 필요한 권한 부여(잘 모르겠으면 모든 권한 클릭) 후 저장
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
LettuceConnectionFactory 를 RedisConnectionFactory 의 빈으로 등록하지 않는 특별한 이유가 있나요?
안녕하세요, 좋은 강의 감사합니다. 강의시간 3:10LettuceConnectionFactory 라는 게 있어서 한 번 들여다봤는데, RedisConnectionFactory 를 구현하는 객체로 보입니다. 이왕이면 RedisConnectionFactory 빈의 구현체로 등록하고, 또 RedisConnectionFactory 를 의존하도록 설계하고 싶은 욕구가 생겨서 그렇게 해봤는데, 일단 별 문제는 안 생긴 것 같습니다.LettuceConnectionFactory 를 실제로 RedisConnectionFactory 의 구현체로 등록해도 상관없나요? 아니면 혹시나 혹시나, RedisConnectionFactory 의 빈으로 등록하면 안 되는 이유가 있는 건가요?@Bean public RedisConnectionFactory lettuceConnectionFactory() { return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port)); }
-
해결됨Real MySQL 시즌 1 - Part 1
EXPLAIN ANALYZE 수행 시 쿼리 실행 계획이 예상과 다릅니다.
먼저 강의 내용이 아닌 책내용을 질문하게 되서 죄송합니다. 하지만 여기 말고 질문할 곳이 마땅치 않아 부득이하게 이곳에 적게 되었습니다. 부디 사정을 봐주시길 부탁드립니다. Real MySQL 1권의 10.2 실행 계획 확인(415pg)에서는 EXPLAIN ANALYZE 실행 시 나타나는 결과에서는 다음과 같은 규칙이 적용된다고 설명되어 있습니다. 들여쓰기가 같은 레벨에서는 상단에 위치한 라인이 먼저 실행들여쓰기가 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행 이 말대로라면 아래 그림에서의 실행순서는 F, D, E, C, B, A 가 됩니다. 하지만 책에서는 실행순서가 D, F, E, C, B, A 로 된다고 적혀있습니다. 들여쓰기가 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행된다고 하여 F 가 가장 먼저 실행될 줄 알았는데 D 부터 시작된다고 적혀있어서 혼동이 왔습니다. 혹시 왜 D 부터 시작하는지 설명을 부탁드릴 수 있을까요?감사합니다.
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
페이지 데이터 캐싱할때 질문
페이지 데이터 캐싱할 때, 아래처럼 컨텐트만 보내는 게아니라@Cacheable(cacheNames = "getBoards",key = "'boards:page:'+ #page + ':size:' + #size", cacheManager = "boardCacheManager") public List<Board> getBoards(int page, int size) { Pageable pageable = PageRequest.of(page - 1, size); Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable); return pageOfBoards.getContent(); }아래처럼 Page 객체 자체를 보내야,실제로 페이징 처리가 가능할텐데요@Cacheable(cacheNames = "getBoards",key = "'boards:page:'+ #page + ':size:' + #size", cacheManager = "boardCacheManager") public Page<Board> getBoards(int page, int size) { Pageable pageable = PageRequest.of(page - 1, size); Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable); return pageOfBoards; }이렇게 하면, Page 역직렬화시 오류가 발생하는데, 이렇게 Page<Board>를 보내줘야 할 때는 어떻게 보내야할지 모르겠습니다. 정확히 캐싱의 역직렬화가 어디까지 가능한지 파악이 잘 안되서..gpt한테 물어보니, Page 같은 특수한 객체는 역직렬화 방법이 없고, db에서 찾은 page를 분해해서 이걸 다시 dto로 감싸서 보내라는데, 이런 방식밖에 없는건지.. Page 데이터 보내실때 어떻게 보내시는지 궁금합니다.
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
혹시 심화 수업은 계획이 없으신가요..?
강의 너무 잘 보았습니다.혹시 힌트 도 주요 튜닝 방법중 하나인데.이쪽은 강의계획이 없으신지 여쭤보고싶습니다.
-
미해결Real MySQL 시즌 1 - Part 1
JPA 사용시 테이블수정에 궁금한점이있습니다
안녕하세요. 현재 JPA를 사용하고있는데 말씀해주신대로 varchar(255)를 기본 string 값으로 잡고있더라고요 이부분을 필요한만큼 테이블수정을 기하는것이 좋은 설계인것인가요? 아니면 jpa 기본권장스펙대로 가는게좋은건가요?
-
미해결비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
RDS관련
java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:116) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:290) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:123) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:77) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.boot.model.relational.Database.<init>(Database.java:45) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:189) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) ~[hibernate-core-6.5.2.Final.jar!/:6.5.2.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.12.jar!/:6.1.12] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.12.jar!/:6.1.12] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.12.jar!/:6.1.12] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.12.jar!/:6.1.12] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205) ~[spring-beans-6.1.12.jar!/:6.1.12] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:954) ~[spring-context-6.1.12.jar!/:6.1.12] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625) ~[spring-context-6.1.12.jar!/:6.1.12] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.3.jar!/:3.3.3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.3.3.jar!/:3.3.3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.3.3.jar!/:3.3.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.3.3.jar!/:3.3.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.3.3.jar!/:3.3.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.3.3.jar!/:3.3.3] at redis_in_spring.practice.PracticeApplication.main(PracticeApplication.java:10) ~[!/:0.0.1-SNAPSHOT] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102) ~[practice-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64) ~[practice-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:40) ~[practice-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]2024-08-27T12:34:29.323Z ERROR 4899 --- [ main] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)2024-08-27T12:34:29.325Z WARN 4899 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)2024-08-27T12:34:29.333Z INFO 4899 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]2024-08-27T12:34:29.377Z INFO 4899 --- [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.2024-08-27T12:34:29.432Z ERROR 4899 --- [ main] o.s.boot.SpringApplication : Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)// ...Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)// ...Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided)application.yml을 깃허브에 올라가지 않도록 처리한 후 EC2에서 직접 작성하는 식으로 해봤는데요. 위와 같은 에러가 계속 발생하는데 무슨 문제때문에 저 에러가 발생하는 것인지 도무지 원인을 모르겠습니다.[서비스]에서 MySQL80이 실행되는 것은 확인했습니다.인텔리제이에서 DataSource 지정시에도 Test Connection이 성공했지만 데이터 역시 안 뜨는 상황입니다.
-
미해결Real MySQL 시즌 1 - Part 1
복합인덱스 정렬
안녕하세요. 강의를 잘 듣고 있는 수강생입니다.강의를 듣다가 좀 다른 결일 수도 있는 궁금증이 있습니다.범위기반 데이터 조회에 아래 예시에서 order by finished_at, id 부분에서 finished_at이 범위검색 쿼리로 들어가는데 이런 경우 뒤에 있는 id는 인덱스를 타지 않는 것으로 알고 있습니다. 그럼 id로 범위 검색하려고 하면 finished_at으로 검색된 범위 안 전체 데이터를 전부 스캔하게 되나요?select * from payments where finished_at ≥ ‘시작날짜’ and finished_at < ‘종료날짜’ and id > 8 order by finished_at, id limit 30
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
redis 클라우드 선택기준
현재 진행중인 프로젝트에서, NCP server로 spring과 db가 구동되고 있는데요.로컬에서 Redis를 적용시키고 있는 와중에, redis 클라우드를 어느곳을 선택해야할지 고민입니다.aws, ncp, redislabs 등등 ncp 자체에도 있을뿐만 아니라, 다른 클라우드 서비스도 많은데, 어떤 기준으로 골라야될지 잘 모르겠습니다. 성능상 aws를 ncp로 연결하는게 안좋을 거 같지만서도, ncp와 aws도 사용해봤다는 걸로 어필할 수 있는 요소가 될수 있을거 같다는 생각이 들어서요 . 그러나 성능/비용 둘다 안좋은데 왜 굳이 따로 썻냐고 이런부분을 지적받을 수도 있을거 같고요.. 조언부탁드립니다.
-
미해결Real MySQL 시즌 1 - Part 1
LATERAL 키워드는 mysql8 에서 잘 지원 되나요?
제목 그대로 입니다.저는 지금 11.4.2-MariaDB-ubu2404 버전을 사용 하고 있는데요.. lateral 키워드를 인식을 못합니다.검색 해서 알아보니 마리아디비 및 mysql 에서는 lateral 키워드를 완벽히 지원 못한다는 내용이 있던데요..원래 PostgreSQL 에서 지원하는 기능 이었다고 하던데요.. mysql 8 강의에서 소개를 하고 있다면 사용 가능한 것 일텐데..저의 데이터베이스 세팅 등이 이상한 걸까요?mysql 8 버전으로 테스트를 해봐야 할까요?lateral 설명을 보니 많은 도움이 될 것 같아 꼭 사용 하고 싶은 기능인데.. 왜 안되는지 알 수가 없네요.. 왜 그럴까요??SELECT e.emp_id, e.emp_name, l.recent_salary, l.salary_dateFROM employees eLEFT JOIN LATERAL ( SELECT salary AS recent_salary, date AS salary_date FROM salary_history sh WHERE sh.emp_id = e.emp_id ORDER BY date DESC LIMIT 1) AS l ON TRUE;하면SQL Error [1064] [42000]: (conn=9) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(이런 에러가 생깁니다.LATERAL 을 인식 못하는 것 같습니다.
-
해결됨비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)
Cache Aside + Write Around 전략에서 궁금한 점이 있습니다~
Cache Aside 전략이redis에 원하는 데이터가 있는지 확인있으면 해당 데이터로 응답없으면 db에서 조회 후 응답 + 레디스에 해당 데이터 저장 그런데 Write Around 전략에서 쓰기(조회를 제외한) 작업의 경우redis에 반영하지 않고, DB에만 반영하는데특정 데이터가 Cache Aside 전략에 따라 db에서 조회되어 응답 후 redis에도 해당 데이터가 저장되어 있는 상태라면,해당 데이터를 수정하는 작업을 하게 될 경우redis에는 반영하지 않고 db에만 반영하게 되면만약 해당 데이터를 조회하려고 할 때 Cache Aside 전략에 의하면 가장 먼저 redis에 해당 데이터가 있는지 확인하는데 여기서 redis에 존재하니까 redis의 데이터로 응답을 해주면 db에 있는 원본 데이터는 수정되어 있으니 데이터 정합성 문제가 생기는 것 아닌가요? 감사합니다!!
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
jpa쿼리튜닝 팁이 궁금합니다.!
안녕하세요 강의 잘 듣고 있습니다!jpa를 사용해서 프로젝트를 진행하면 쿼리 메서드를 사용할텐데 select * <- 이걸로 넓은 범위를 조회할텐데jpql로 다 작성해주어야 하나요?jpa로 프로젝트 진행할때 팁이나 검색 키워드 추천해주세요!
-
해결됨Real MySQL 시즌 1 - Part 1
char vs varchar 타입에 궁금한 점이 있습니다.
varchar 타입의 경우 데이터 업데이트시 파편화가 생길 수 있다는 점을 이해했습니다! 다만, char 타입을 쓰면 좋은 경우가 문자열의 길이가 가변성이 크지 않은 경우라고 한다면varchar의 경우에도 길이 가변성이 크지 않은 탓에 처음부터 선언해둔 길이를 벗어나지 않을 가능성이 클 거 같다는 생각이 들었습니다. 만약 주민등록번호라고 한다면 13자리니까char(13)로 하거나 varchar(13)해도 이 자리수를 넘어가지 않을 것이고자주 업데이트 되는 경우라고 해도 char도 그렇고 varchar도 그렇고 길이수만 잘 잡아놓으면fragmenation 문제가 없는 것이 아닌지 궁금합니다. 그럼에도 char를 쓰는 것이 더 좋은 이유가 있을지 궁금해서 질문남깁니다!
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
특정 부서에서 최대 연봉을 가진 사용자 조회 sql 쿼리 질문
안녕하세요, 좋은 강의 감사합니다. 제공해 주신 쿼리에 대해 질문이 있는데요,제 생각에는 아래 쿼리가 특정 부서에서 최대 연봉을 가진 사용자를 조회하는게 아닌,전체 부서에서 최대 연봉이 x 라고 하면,세 부서에서 그 값이 있으면 출력하는 문인것 같은데,제가 어느 부분에서 헷갈린 건지 알려주시면 감사하겠습니다.SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users) AND department IN ('Sales', 'Marketing', 'IT'); SELECT MAX(salary) FROM users 는 users 테이블의 최대 salary 를 가져오는것이고,괄호 밖의 department In (...) 은 부서 세개,그리고 salary = (SELECT MAX ...) 와 함께 저 salary 에 해당 하는 users 가져오는 것이 아닌가요? 제가 sql 초보라 양해 해주시면 감사하겠습니다 ...
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
created_at 에 index 거는것과 지속적인 데이터 증가
안녕하세요, 좋은 강의 감사합니다. created_at 에 index 를 걸어서 order by 와 같은 문제를 해결하는 것을 보았는데요, 데이터가 지속적으로 증가하고 밀리초 단위로 들어오는 created_at 이 있다면, 이것들을 모두 다 인덱스로 걸어도 괜찮은건가요?? 데이터가 계속 커지면 어떻게 처리하나요??