Gopher Academy
3.34K subscribers
920 photos
40 videos
280 files
2.02K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
✍️برای ارتباط بین دو سرویس Go با استفاده از Kafka
باید چند مرحله را طی کنید. این مراحل شامل نصب و تنظیم Kafka، ایجاد موضوعات (topics) در Kafka، نوشتن تولیدکننده (producer) و مصرف‌کننده (consumer) در Go، و اجرای سرویس‌ها است. در زیر یک راهنمای کامل برای این فرآیند آورده شده است:

❇️ 1. نصب و راه‌اندازی Kafka
ابتدا باید Kafka را نصب و راه‌اندازی کنید. می‌توانید از Docker برای ساده‌تر کردن این فرآیند استفاده کنید.

راه‌اندازی Kafka با Docker:
# 
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka

# راه‌اندازی Zookeeper
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper

# راه‌اندازی Kafka
docker run -d --name kafka -p 9092:9092 --link zookeeper wurstmeister/kafka \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_BROKER_ID=1

❇️2. ایجاد موضوع (Topic) در Kafka
برای ایجاد موضوع در Kafka از ابزارهای CLI استفاده کنید.

docker exec kafka kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

❇️ 3. نصب کتابخانه‌های Kafka برای Go

می‌توانید از کتابخانه‌ی [sarama](https://github.com/Shopify/sarama) برای کار با Kafka در Go استفاده کنید.

go get github.com/Shopify/sarama

❇️4. نوشتن تولیدکننده (Producer) در Go
کد زیر یک تولیدکننده Kafka را در Go پیاده‌سازی می‌کند:

package main

import (
"log"
"os"

"github.com/Shopify/sarama"
)

func main() {
brokerList := []string{"localhost:9092"}
topic := "my-topic"

config := sarama.NewConfig()
config.Producer.Return.Successes = true

producer, err := sarama.NewSyncProducer(brokerList, config)
if err != nil {
log.Fatalln("Failed to start producer:", err)
}
defer producer.Close()

msg := &sarama.ProducerMessage{
Topic: topic,
Key: sarama.StringEncoder("key"),
Value: sarama.StringEncoder("value"),
}

partition, offset, err := producer.SendMessage(msg)
if err != nil {
log.Fatalln("Failed to send message:", err)
}

log.Printf("Message is stored in topic(%s)/partition(%d)/offset(%d)\n", topic, partition, offset)
}

❇️5. نوشتن مصرف‌کننده (Consumer) در Go
کد زیر یک مصرف‌کننده Kafka را در Go پیاده‌سازی می‌کند:

package main

import (
"log"

"github.com/Shopify/sarama"
)

func main() {
brokerList := []string{"localhost:9092"}
topic := "my-topic"
config := sarama.NewConfig()

master, err := sarama.NewConsumer(brokerList, config)
if err != nil {
log.Fatalln("Failed to start consumer:", err)
}
defer master.Close()

consumer, err := master.ConsumePartition(topic, 0, sarama.OffsetOldest)
if err != nil {
log.Fatalln("Failed to start partition consumer:", err)
}
defer consumer.Close()

for message := range consumer.Messages() {
log.Printf("Consumed message offset %d: %s\n", message.Offset, string(message.Value))
}
}



2. موضوع را در Kafka ایجاد کنید.
3. کد تولیدکننده را اجرا کنید تا پیام‌ها به Kafka ارسال شوند.
4. کد مصرف‌کننده را اجرا کنید تا پیام‌های دریافتی از Kafka را پردازش کند.

با این روش، می‌توانید دو سرویس Go را با استفاده از Kafka به هم متصل کنید. Kafka به عنوان یک پیام‌رسان با کارایی بالا، ارتباط غیرهمزمان بین سرویس‌ها را ممکن می‌سازد و از مدیریت بار کاری به خوبی پشتیبانی می‌کند.


👑 @gopher_academy | 💸 Donate | 💋 Boost
9👍3🔥3🍾2💯1

👑 @gopher_academy | 💸 Donate | 💋 Boost
💊8👍7💯41


📌 Backend Software Engineer Golang for Lounge (all genders)

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: zalando

📍 Location: GERMANY

🔗 Tags: #golang #git #kubernetes #aws #microservices



📌 BackEnd (Golang) Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: moon active

📍 Location: POLAND

🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍43
✍️انتخاب بین Kafka و gRPC برای ارتباط بین سرویس‌ها به نیازها و الزامات خاص پروژه شما بستگی دارد. هر یک از این ابزارها دارای مزایا و معایب خاص خود هستند که در زیر به آن‌ها پرداخته شده است تا بتوانید تصمیم بهتری بگیرید:

💜Kafka
🔻مزایا:
🔹- غیرهمزمانی و تحمل‌پذیری بالا: Kafka به عنوان یک پیام‌رسان غیرهمزمان عمل می‌کند و می‌تواند حجم بالایی از داده‌ها را مدیریت کند.
🔹- مقیاس‌پذیری: Kafka برای مدیریت مقیاس‌پذیری بالا و پردازش داده‌های بزرگ طراحی شده است.
🔹- قابلیت ذخیره‌سازی پیام‌ها: Kafka پیام‌ها را برای مدت زمان مشخصی ذخیره می‌کند، بنابراین مصرف‌کنندگان می‌توانند پیام‌ها را با تأخیر پردازش کنند.
🔹- پشتیبانی از پردازش داده‌های جریانی: Kafka به خوبی با سیستم‌های پردازش داده‌های جریانی (Stream Processing) مانند Apache Flink و Apache Storm سازگار است.

🔻معایب:
🔹- پیچیدگی در تنظیم و نگهداری: راه‌اندازی و نگهداری Kafka ممکن است پیچیده‌تر از برخی ابزارهای دیگر باشد.
🔹- تأخیر: به دلیل ماهیت غیرهمزمانی، ممکن است تأخیر بیشتری نسبت به ارتباطات همزمان مانند gRPC داشته باشد.


💜gRPC
🔻مزایا:
🔹- کارایی بالا و تأخیر کم: gRPC از پروتکل HTTP/2 و فرمت باینری پروتوباف استفاده می‌کند که تأخیر را کاهش می‌دهد و کارایی را افزایش می‌دهد.
🔹- پشتیبانی از ارتباط دوجهته و استریمینگ: gRPC از استریمینگ دوجهته پشتیبانی می‌کند که برای برخی کاربردها بسیار مفید است.
🔹- پشتیبانی از چندین زبان: gRPC از بسیاری از زبان‌های برنامه‌نویسی پشتیبانی می‌کند و به راحتی می‌توان از آن در محیط‌های مختلف استفاده کرد.

🔻معایب:
🔹- عدم ذخیره‌سازی پیام‌ها: gRPC پیام‌ها را ذخیره نمی‌کند، بنابراین اگر مصرف‌کننده در دسترس نباشد، پیام‌ها از دست می‌روند.
🔹- عدم پشتیبانی از غیرهمزمانی به شکل بومی: gRPC به طور بومی برای ارتباطات همزمان طراحی شده است، بنابراین برای کاربردهای غیرهمزمان ممکن است مناسب نباشد.

🤝انتخاب بهترین روش
در نهایت، انتخاب بین Kafka و gRPC به نیازهای خاص پروژه شما بستگی دارد:

- اگر نیاز به پردازش داده‌های بزرگ، غیرهمزمانی، و تحمل‌پذیری بالا دارید، Kafka انتخاب بهتری است.
- اگر نیاز به ارتباط سریع و با تأخیر کم، و پشتیبانی از ارتباطات دوجهته دارید، gRPC مناسب‌تر است.

🤝 ترکیب Kafka و gRPC
در برخی پروژه‌ها، ترکیب Kafka و gRPC می‌تواند مزایای هر دو را به شما بدهد. برای مثال، می‌توانید از gRPC برای ارتباطات سریع و با تأخیر کم بین سرویس‌ها استفاده کنید و از Kafka برای پردازش داده‌های جریانی و مدیریت بار کاری بهره ببرید.

🔥🔥 مثال ترکیب Kafka و gRPC
فرض کنید شما یک سیستم سفارش‌دهی آنلاین دارید:
- از gRPC برای مدیریت درخواست‌های بلادرنگ (real-time) مانند ثبت سفارش و دریافت وضعیت سفارش استفاده می‌کنید.
- از Kafka برای پردازش‌های پس‌زمینه‌ای (background processing) مانند ارسال ایمیل‌های تأیید سفارش و به‌روزرسانی موجودی کالا استفاده می‌کنید.

این ترکیب به شما اجازه می‌دهد تا از مزایای هر دو ابزار بهره‌مند شوید و سیستم خود را بهینه‌تر کنید.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍10🕊1🍾1💋1
🔴چندتا مقاله جالب که امروز توی golang weekly منتشر شده

🟢 اگر میخوای بهتر در مورد چنل ها توی گولنگ بدونی این مقاله خوبیه
🔵 https://www.dolthub.com/blog/2024-06-21-channel-three-ways/

🟢 یه مقاله جذاب که خودم به شخصه منو یاد دانشگاه انداخت مقاله زیر هست که میگه ساخت یک ریجیکس ار ابتدا در گو
🔵 https://lewismetcalf.com/series/making-regex-from-scratch-in-go/

🟢 راهنمای عملی برای به روز رسانی ماژول Go
🔵 https://carlosbecker.com/posts/pragmatic-gomod-bump/

🟢 اگر تست می نویسی مثل بعضی ها😅 این مقاله خوبیه
🔵 https://henvic.dev/posts/testing-go/

🟢 هفت اشتباه رایج در استفاده از اینترفیس ها
🔵 https://medium.com/@andreiboar/7-common-interface-mistakes-in-go-1d3f8e58be60

🟢 اگر از چت جی پی تی توی کدهات میخوای استفاده کنی این کتابخونه خوبیه
🔵 https://github.com/sashabaranov/go-openai

🟢 اگر دنبال یه کتابخونه برای استفاده از متغیر های محیطی توی کدت هستی اینم کتابخونه خوبیه البته خودم فعلن استفاده نکردم
🔵 https://github.com/caarlos0/env



#golang_weekly

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥52👍2
What mechanism does Go use to manage memory automatically?
Anonymous Quiz
85%
Garbage collection
10%
Reference counting
5%
External memory manager*
👍4
📌 BackEnd (Golang) Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: moon active

📍 Location: POLAND

⌨️ Category: #Programming

🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql



📌 Staff Backend Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: plexus resource solutions

📍 Location: CANADA

⌨️ Category: #Programming

🔗 Tags: #golang #microservices #cloud #blockchain


📌 Backend Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: sword health

📍 Location: PORTUGAL

⌨️ Category: #Programming

🔗 Tags: #nosql #golang #redis #c #responsive #sql


👑 @gopher_academy | 💸 Donate | 💋 Boost
1
✍️فرق kafka و rabbitmq

🔵معماری
🟢Kafka:

🔻مدل انتشار-اشتراک: Kafka بر اساس مدل انتشار-اشتراک (publish-subscribe) کار می‌کند. تولیدکنندگان پیام‌ها را به مباحث (topics) می‌فرستند و مصرف‌کنندگان پیام‌ها را از این مباحث می‌خوانند.
🔻ذخیره‌سازی پایدار: Kafka پیام‌ها را به صورت پایدار در دیسک ذخیره می‌کند و به مصرف‌کنندگان اجازه می‌دهد که پیام‌ها را بر اساس آفست (offset) خاصی دوباره بخوانند.
🔻مقیاس‌پذیری: Kafka به راحتی مقیاس‌پذیر است و می‌تواند به صورت افقی با افزودن نودهای بیشتر در کلاستر (cluster) خود گسترش یابد.
🔻کارایی بالا: Kafka برای پردازش حجم زیادی از داده‌ها با تاخیر کم و توان عملیاتی بالا طراحی شده است.
🟢RabbitMQ:

🔻مدل صف-پیام: RabbitMQ بر اساس مدل صف-پیام (message queue) کار می‌کند. پیام‌ها در صف‌ها قرار می‌گیرند و مصرف‌کنندگان پیام‌ها را از صف‌ها می‌خوانند.
🔻قابلیت‌های مسیریابی پیشرفته: RabbitMQ از انواع مختلف مبادلات (exchanges) مانند مستقیم، موضوعی و هدرها برای مسیریابی پیام‌ها استفاده می‌کند.
🔻پشتیبانی از پروتکل‌های مختلف: RabbitMQ از پروتکل‌های مختلف پیام‌رسانی مانند AMQP، MQTT و STOMP پشتیبانی می‌کند.
🔻سادگی: RabbitMQ به راحتی قابل نصب و پیکربندی است و برای موارد استفاده ساده‌تر بسیار مناسب است.

🔵موارد استفاده
🟢Kafka:

🔻پردازش داده‌های جریانی: Kafka برای پردازش داده‌های جریانی و تجزیه و تحلیل داده‌های بزرگ در زمان واقعی بسیار مناسب است.
🔻سیستم‌های ثبت تراکنش (log): Kafka به عنوان یک سیستم ثبت تراکنش توزیع شده برای نگهداری و پردازش لاگ‌های بزرگ استفاده می‌شود.
🔻میکروسرویس‌ها: Kafka به عنوان یک سیستم پیام‌رسانی توزیع شده برای ارتباط بین میکروسرویس‌ها استفاده می‌شود.

🟢RabbitMQ:

🔻میکروسرویس‌ها: RabbitMQ نیز برای ارتباط بین میکروسرویس‌ها مناسب است، به ویژه در مواردی که نیاز به مسیریابی پیشرفته پیام‌ها وجود دارد.
🔻مدیریت وظایف: RabbitMQ برای مدیریت و پردازش وظایف پس‌زمینه مناسب است.
🔻سیستم‌های صف: RabbitMQ برای مواردی که نیاز به صف‌های ساده برای پیام‌رسانی و مدیریت بار کاری وجود دارد، مناسب است.

🔵کارایی و مقیاس‌پذیری
🟢Kafka:

🔻توان عملیاتی بالا: Kafka برای پردازش حجم زیادی از داده‌ها با توان عملیاتی بالا و تاخیر کم طراحی شده است.
🔻مقیاس‌پذیری افقی: Kafka به راحتی با افزودن نودهای بیشتر به کلاستر خود مقیاس‌پذیر است.
🟢RabbitMQ:

🔻کارایی متوسط: RabbitMQ نیز کارایی بالایی دارد، اما در مقایسه با Kafka ممکن است برای حجم بسیار زیاد داده‌ها کارایی کمتری داشته باشد.
🔻مقیاس‌پذیری: RabbitMQ به صورت افقی مقیاس‌پذیر است، اما ممکن است برای مقیاس‌بندی به اندازه Kafka بهینه نباشد.

🥂جمع‌بندی
🟢Kafka:

🔻مناسب برای پردازش داده‌های جریانی، سیستم‌های ثبت تراکنش و ارتباط بین میکروسرویس‌ها با حجم بالای داده‌ها.
🔻توان عملیاتی بالا و مقیاس‌پذیری افقی عالی.
🟢RabbitMQ:

🔻مناسب برای مدیریت وظایف، مسیریابی پیشرفته پیام‌ها و سیستم‌های صف با نیاز به پشتیبانی از پروتکل‌های مختلف.
🔻سادگی در نصب و پیکربندی و قابلیت‌های مسیریابی پیشرفته.


👑 @gopher_academy | 💸 Donate | 💋 Boost
5👍1🍾1🎃1
7 استراتژی مهم برای اسکیل کردن دیتابیس تون👌

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍9
✍️در زبان برنامه‌نویسی Go و به ویژه در کتابخانه net/http`، دو مقدار `nil و http.NoBody تفاوت‌های مهمی دارند که باید به آن‌ها توجه کنید. این تفاوت‌ها به ویژه در زمینه استفاده از درخواست‌ها (requests) و پاسخ‌ها (responses) اهمیت پیدا می‌کنند.

🟢nil

در Go، nil می‌تواند به عنوان مقدار پیش‌فرض برای انواع اشاره‌گرها، رابط‌ها (interfaces)، نقشه‌ها (maps)، اسلایس‌ها (slices)، کانال‌ها (channels) و توابع استفاده شود. وقتی که یک متغیر از نوع اشاره‌گر یا رابط مقدار nil دارد، به این معنی است که به هیچ چیز اشاره نمی‌کند یا مقداردهی نشده است.

🔵 ویژگی‌ها:
1. عدم اشاره به هیچ چیز: nil به این معنی است که هیچ مقدار یا آدرسی وجود ندارد.
2. پیش‌فرض برای اشاره‌گرها و رابط‌ها: بسیاری از انواع داده‌ها می‌توانند مقدار nil داشته باشند، از جمله *http.Request.Body.

🟢http.NoBody

اhttp.NoBody یک مقدار خاص در بسته net/http است که به طور خاص به عنوان یک جایگزین برای بدنه‌ی (body) خالی در درخواست‌ها و پاسخ‌ها استفاده می‌شود. این مقدار به طور خاص برای بهینه‌سازی و جلوگیری از استفاده از منابع غیرضروری طراحی شده است.

🔵 ویژگی‌ها:
1. بدنه خالی بهینه شده: http.NoBody به جای استفاده از یک اشاره‌گر nil برای بدنه خالی، به عنوان یک جایگزین بهینه شده استفاده می‌شود.
2. پیاده‌سازی `io.ReadCloser`: http.NoBody یک نوع خاص است که io.ReadCloser را پیاده‌سازی می‌کند و همیشه خواندن صفر بایت را برمی‌گرداند و بستن بدون خطا.

🔵 مزایا:
1. کاهش استفاده از منابع: به دلیل پیاده‌سازی خاص، استفاده از http.NoBody می‌تواند منجر به کاهش استفاده از منابع و بهینه‌سازی عملکرد شود.
2. سازگاری با رابط‌ها: چون http.NoBody رابط io.ReadCloser را پیاده‌سازی می‌کند، می‌توان آن را در جاهایی که انتظار io.ReadCloser می‌رود، به کار برد.

🔵 مقایسه در زمینه HTTP
هنگام کار با درخواست‌ها (requests) و پاسخ‌ها (responses) در net/http`، تفاوت بین استفاده از `nil و http.NoBody مهم است.

🔵 مثال: ایجاد یک درخواست HTTP با بدنه خالی
استفاده از nil:

req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
// handle error
}


در اینجا، بدنه درخواست به صورت nil تعیین می‌شود که به معنای عدم وجود بدنه است.
🔵استفاده از http.NoBody:

req, err := http.NewRequest("GET", "http://example.com", http.NoBody)
if err != nil {
// handle error
}


در اینجا، بدنه درخواست به طور صریح به عنوان http.NoBody تنظیم می‌شود که نشان‌دهنده یک بدنه خالی بهینه شده است.

🍾 جمع‌بندی

- `nil`:
- نشان‌دهنده عدم وجود بدنه یا مقدار.
- مقدار پیش‌فرض برای انواع اشاره‌گرها و رابط‌ها.
- می‌تواند برای بدنه‌های خالی استفاده شود، اما از لحاظ عملکردی بهینه نیست.

- `http.NoBody`:
- نشان‌دهنده یک بدنه خالی بهینه شده برای درخواست‌ها و پاسخ‌ها.
- پیاده‌سازی io.ReadCloser.
- بهینه‌تر برای مواردی که بدنه خالی نیاز است، به ویژه در زمینه HTTP.

به طور کلی، استفاده از http.NoBody به جای nil در مواردی که بدنه خالی در HTTP نیاز است، می‌تواند به بهبود عملکرد و کاهش استفاده از منابع کمک کند.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍123🔥1🍾1💅1
Massimo DevMassimo Dev

#برنامه_نویس سنیور کیه واقعا؟

فقط یک جمله:
کسی که برای پیچیده‌ترین صورت مسأله‌ها، ساده‌ترین راه حل‌ها رو ارائه میده.

اگر حس می کنید کدنویسی پیچیده یعنی سنیوریتی، باخت دادید تا الان.

مشتی باشید!

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥18👍9🍾2💋1
برای رسیدن به متریک مناسب سرویس تون یه سری راه حل اینجا گذاشته

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍52🕊1
Which of the following is true about Go's deadlock detection?
Anonymous Quiz
10%
Go detects deadlocks only in the main function
90%
The Go runtime can detect deadlocks and panic if it occurs
🏆4🔥1🕊1
لیستی از مکانیزم های قفل برای جلوگیری از دسترسی همزمان دادها و ناسازگاری داده ها
👇👇👇👇

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍5
🔻لیستی از مکانیزم های قفل برای جلوگیری از دسترسی همزمان دادها و ناسازگاری داده ها🔻

🎯1. Shared Lock (S Lock)
It allows multiple transactions to read a resource simultaneously but not modify it. Other transactions can also acquire a shared lock on the same resource.

🎯2. Exclusive Lock (X Lock)
It allows a transaction to both read and modify a resource. No other transaction can acquire any type of lock on the same resource while an exclusive lock is held.

🎯3. Update Lock (U Lock)
It is used to prevent a deadlock scenario when a transaction intends to update a resource.

🎯4. Schema Lock
It is used to protect the structure of database objects.

🎯5. Bulk Update Lock (BU Lock)
It is used during bulk insert operations to improve performance by reducing the number of locks required.

🎯6. Key-Range Lock
It is used in indexed data to prevent phantom reads (inserting new rows into a range that a transaction has already read).

🎯7. Row-Level Lock
It locks a specific row in a table, allowing other rows to be accessed concurrently.

🎯8. Page-Level Lock
It locks a specific page (a fixed-size block of data) in the database.

🎯9. Table-Level Lock
It locks an entire table. This is simple to implement but can reduce concurrency significantly.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍41
Massimo Dev

میدونستید #ایندکس ترکیبی یا Composite Index تو #دیتابیس چی هست؟ یه سوالیه که معمولا تو #مصاحبه های #استخدام #برنامه_نویسی می‌پرسن!

ایندکس ترکیبی، ایندکسی هست که چندتا ستون رو باهم تو خودش داره. یعنی به جای اینکه فقط یه ستون رو ایندکس کنیم، میایم و چندتا ستون رو با همدیگه ایندکس می‌کنیم تا وقتی که توی کوئری‌ها (دستورات جستجو) از چندتا ستون استفاده می‌کنیم، دیتابیس سریع‌تر بتونه نتایج رو پیدا کنه.

👈 مثال از ایندکس ترکیبی

فرض کن یه جدول به اسم employees داریم که این ستون‌ها رو داره:

- employee_id
- first_name
- last_name
- department
- hire_date

اگه بخوایم جستجوهایی که بر اساس department و hire_date هستن سریع‌تر بشن، میایم و یه ایندکس ترکیبی روی این دوتا ستون درست می‌کنیم:

CREATE INDEX idx_department_hire_date ON employees(department, hire_date);


👈 ترتیب ستون‌ها توی ایندکس ترکیبی:

ترتیب ستون‌ها توی ایندکس ترکیبی خیلی مهمه. این ایندکس بیشتر به درد جستجوهایی می‌خوره که از ستون‌های اول ایندکس شروع بشن.

🍒 مثال‌هایی از کوئری‌ها

1. کوئری‌ای که از هر دو ستون استفاده می‌کنه**:

SELECT * FROM employees WHERE department = 'Sales' AND hire_date = '2023-01-15';

این کوئری می‌تونه از ایندکس ترکیبی idx_department_hire_date کامل استفاده کنه.

2. کوئری‌ای که فقط از ستون اول استفاده می‌کنه:
 SELECT * FROM employees WHERE department = 'Sales';

این کوئری هم می‌تونه از ایندکس استفاده کنه چون با ستون department شروع شده.

3. کوئری‌ای که فقط از ستون دوم استفاده می‌کنه:

SELECT * FROM employees WHERE hire_date = '2023-01-15';

این کوئری نمی‌تونه به طور مؤثری از ایندکس ترکیبی idx_department_hire_date استفاده کنه، چون با ستون department شروع نمی‌شه. به این معنا نیست که تحت هیچ شرایطی از ایندکس استفاده نمی‌کنه، بلکه به این معناست که از بخش زیادی از ایندکس استفاده نمی‌شه و عملاً سود چندانی از ایندکس نمی‌بره.

4. کوئری‌ای که از هر دو ستون ولی به ترتیب برعکس استفاده می‌کنه:

SELECT * FROM employees WHERE hire_date = '2023-01-15' AND department = 'Sales';

این کوئری هم می‌تونه از ایندکس استفاده کنه چون از هر دو ستون استفاده کرده، ولی بهتره ستون‌ها رو به همون ترتیبی که تو ایندکس تعریف شدن استفاده کنیم.

👈👈👈 خلاصه

🔺 ترتیب مهمه: ترتیب ستون‌ها توی ایندکس ترکیبی خیلی مهمه. ایندکس وقتی بهترین کارایی رو داره که جستجوها از ستون‌های اول ایندکس شروع بشن.
🔺 استفاده از پیشوند: جستجوهایی که از ستون اول، دو ستون اول و همینطور ادامه دارن، از ایندکس بهره می‌برن.
🔺 استفاده جزئی: استفاده از ستون دوم یا بعدی بدون ستون اول نمی‌تونه از ایندکس ترکیبی استفاده کنه.

فهمیدن اینکه کوئری‌هات چجوری با ایندکس‌ها کار می‌کنن خیلی مهمه تا بتونی عملکرد دیتابیس رو بهتر کنی.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍7💯4🔥1🎉1🕊1💋1
👍3🏆3
Massimo Dev
📗 اصول مهم کد ریویو یا بررسی کد: YAGNI، KISS و DRY
من خودم موقع کد ریویوها این سه اصل رو خیلی با دقت رعایت می‌کنم.

🔶 1. YAGNI (You aren't gonna need it):
- این اصل داره میگه از اضافه کردن ویژگی‌ها یا کدی که الان لازم نیست خودداری کن. این کار باعث میشه کدت تمیز و ساده بمونه.
🔹 - مثال: اگه تو داری یه فرم ساده برای ورود اطلاعات می‌نویسی، لازم نیست از الان برای فیلتر کردن داده‌ها یا اضافه کردن قابلیت‌های پیچیده فکر کنی. اونها رو بعداً وقتی واقعاً نیاز بود اضافه کن.

🔶 2. KISS (Keep it simple & stupid):
- میگه سعی کن کدت ساده باشه. راه‌حل‌های پیچیده معمولاً میشه ساده‌ترشون کرد و این باعث میشه کد راحت‌تر خوانده و نگهداری بشه.
🔹 - مثال: به جای نوشتن یه تابع پیچیده برای محاسبه تخفیف، یه تابع ساده بنویس که فقط تخفیف رو بر اساس درصد حساب کنه. اگه بعداً نیاز به محاسبات پیچیده‌تر بود، اون موقع بهش اضافه کن.

🔶 3. DRY (Don't repeat yourself):
- میگه جایی که میشه، از کدهای موجود استفاده کن و از تکرار کد خودداری کن. این کار باعث میشه نگهداری کد راحت‌تر باشه و احتمال خطاها کمتر بشه.
🔹- مثال: اگه داری چند بار یه عملیات مشابه مثل محاسبه مالیات رو انجام میدی، اون رو تو یه تابع مجزا بنویس و هر بار از اون تابع استفاده کن.

با رعایت این اصول در کد ریویوها، می‌تونی کدی بنویسی که هم خواناتر، هم قابل نگهداری‌تر و هم بهینه‌تر باشه. همه چیز در مورد نوشتن کد کمتر ولی بهتره.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍7🔥3