Я новичок в golang, а также в оптимизации баз данных.
У меня есть простое приложение, написанное на ходу, и база данных mysql, где отправляются запросы, инициализированные через Интернет.
Для получения запросов требуется около 5 секунд или чуть больше? Можно ли как-то его оптимизировать?
Также, если обновить несколько раз, то ответ может быть уже 50 с и даже больше,
исключения с «неверным адресом памяти или разыменованием нулевого указателя» или «Ошибка 1040: может появиться слишком много соединений».
Как избежать этого и сделать все запросы управляемыми в течение эффективного периода времени?
Это структура таблицы
CREATE TABLE sportsmen (
sp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender enum('M','F') NOT NULL,
start_date date NOT NULL,
PRIMARY KEY (sp_no)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE points (
sp_no INT NOT NULL,
point INT NOT NULL,
date DATE NOT NULL
);
Количество записей составляет около 300000 для спортсменов и 1 000 000 для их очков.
это функция, которая вызывается при каждом запросе
var db *sql.DB
func init() {
db, _ = sql.Open("mysql", "<connection>?charset=utf8")
//checkErr(errcon)
err := db.Ping()
checkErr(err)
yt := reflect.TypeOf(db).Kind()
fmt.Printf("%T: %s\n", yt, yt)
}
func sportsmanPoints(w http.ResponseWriter, r *http.Request) {
start := time.Now()
sportsmen, err := db.Query("SELECT sp_no, first_name FROM sportsmen LIMIT ?,20", rand.Intn(100000))
checkErr(err)
for sportsmen.Next() {
var spNo string
var firstName string
err = sportsmen.Scan(&spNo, &firstName)
checkErr(err)
spPoints, err := db.Query("SELECT max(point) FROM points WHERE sp_no =" + spNo)
for spPoints.Next() {
var spPoint int
err = spPoints.Scan(&spPoint)
checkErr(err)
points.Data = append(points.Data, Point{Name: firstName, Point: spPoint})
}
}
data, err := json.Marshal(points.Data)
if err != nil {
log.Fatal(err)
}
fmt.Fprintln(w, string(data))
elapsed := time.Since(start)
fmt.Println("Date:", time.Now(), "Response time:", elapsed)
points.Data = nil
data = nil
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func main() {
http.HandleFunc("/", sportsmanPoints)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
Спасибо.