select语句在mysql上运行速度很慢

时间:2016-11-01 16:07:28

标签: php mysql json

即使limit = 10,这个php select语句也会非常慢。

$conn = new mysqli($DBServer, $DBUser, $DBPass, $DBName);

if ($conn->connect_error) {
    trigger_error('Database connection failed: '  . $conn->connect_error, E_USER_ERROR);
    exit();
}

$sql = 'SELECT id, date, UNIX_TIMESTAMP(date) AS UDATE, col1, col2 FROM ' . $table . ' ORDER BY UDATE DESC LIMIT ' . $id . ', ' . $limit . ';'; 

$result = $conn->query($sql);
$data = array();
if($result === false) {
    trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR);
} 
else {
    while ($row = $result->fetch_assoc()) {
        $data[] = $row;
    }
}

$result->free();

echo json_encode(array_reverse($data));

此表还有非常大的数据1400万行,它是MyISAM引擎。

如何优化此脚本以更快地运行?

这是我的CREATE TABLE

CREATE TABLE `my_tbl` 
(`id` int(11) NOT NULL AUTO_INCREMENT, 
`date` varchar(45) NOT NULL, 
`col1` float NOT NULL, 
`col2` float NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `date` (`date`)) 
ENGINE=MyISAM AUTO_INCREMENT=14475739 
DEFAULT CHARSET=latin1

非常感谢

2 个答案:

答案 0 :(得分:2)

此查询中存在许多问题,但其中最大的问题是您在计算列上调用import pygame import time import random pygame.init() display_width = 800 display_height = 600 dark_blue = (0,178,210) blue = (109,178,201) black = (0,0,0) white = (255,255,255) red = (255,0,0) brown = (102, 51, 0) ship_width = 96 gameDisplay = pygame.display.set_mode((display_width,display_height)) pygame.display.set_caption('_Asteroid Belt_') clock = pygame.time.Clock() thingImg = pygame.image.load("/home/pi/Desktop/asteroid.png") shipImg = pygame.image.load('/home/pi/Desktop/spaceship.png') bg = pygame.image.load("/home/pi/Desktop/py.png") bgi = pygame.image.load("/home/pi/Desktop/introbg.jpg") pause = False def quitgame(): pygame.quit() quit() def unpause(): global pause pause = False def paused(): while pause: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() largeText = pygame.font.Font('freesansbold.ttf',115) TextSurf, TextRect = text_objects("Paused", largeText) TextRect.center = ((display_width/2),(display_height/2)) gameDisplay.blit(TextSurf, TextRect) button("Start Flight",100,450,200,100,dark_blue,blue,game_loop) button("Land on Desktop",500,450,200,100,dark_blue,blue,quitgame) #pygame.draw.rect(gameDisplay,dark_blue,(500,450,200,100)) pygame.display.update() clock.tick(15) def game_intro(): intro = True while intro: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() gameDisplay.blit(bgi,(0,0)) largeText = pygame.font.Font('freesansbold.ttf',115) TextSurf, TextRect = text_objects("Asteroid Belt", largeText) TextRect.center = ((display_width/2),(display_height/2)) gameDisplay.blit(TextSurf, TextRect) button("Start Flight",100,450,200,100,dark_blue,blue,game_loop) button("Land on Desktop",500,450,200,100,dark_blue,blue,quitgame) #pygame.draw.rect(gameDisplay,dark_blue,(500,450,200,100)) pygame.display.update() clock.tick(15) def message_display2(text): largeText = pygame.font.Font('freesansbold.ttf',115) TextSurf, TextRect = text_objects(text, largeText) TextRect.center = ((display_width/2),(display_height/2)) gameDisplay.blit(TextSurf, TextRect) pygame.display.update() time.sleep(2) def things_dodged(count): font = pygame.font.SysFont(None,25) text = font.render("Dodged: "+str(count), True, white) gameDisplay.blit(text, (0,0)) def things(x,y, thing_width, thing_height,thing_startx,thing_starty): gameDisplay.blit(thingImg, (x,y)) def ship(x,y): gameDisplay.blit(shipImg,(x,y)) def text_objects(text, font): textSurface = font.render(text, True, white) return textSurface, textSurface.get_rect() def message_display(text): largeText = pygame.font.Font('freesansbold.ttf',115) TextSurf, TextRect = text_objects(text, largeText) TextRect.center = ((display_width/2),(display_height/2)) gameDisplay.blit(TextSurf, TextRect) pygame.display.update() time.sleep(2) game_loop() def crash(): message_display("You Crashed!") def button(msg,x,y,w,h,ic,ac,action=None): mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if x + w>mouse[0]>x and y+h > mouse[1] >y: pygame.draw.rect(gameDisplay,ac,(x,y,w,h)) if click[0] == 1 and action != None: if action == game_loop: game_loop() elif action == quitgame: pygame.quit() quit() else: pygame.draw.rect(gameDisplay,ic,(x,y,w,h)) smallText = pygame.font.Font('freesansbold.ttf',20) textSurf, textRect = text_objects(msg,smallText) textRect.center = ((x+(w/2)),(y+(h/2))) gameDisplay.blit(textSurf, textRect) def game_loop(): global pause x = (300) y = (410) x_change=0 thing_startx = random.randrange(0, display_width) thing_starty = -600 thing_speed = 5 thing_width = 100 thing_height = 100 dodged = 0 gameExit = False while not gameExit: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x_change = -20 if event.key == pygame.K_RIGHT: x_change = 20 if event.key == pygame.K_p: pause = True paused() if event.type == pygame.KEYUP: if event .key == pygame.K_LEFT or event.key == pygame.K_RIGHT: x_change = 0 x+= x_change gameDisplay.blit(bg, (0,0)) things(thing_startx,thing_starty,thing_width,thing_height,x,y) thing_starty += thing_speed thing_height=100 ship(x,y) things_dodged(dodged) if x > display_width - ship_width or x<0: crash() if thing_starty > display_height: thing_starty = 0 - thing_height thing_startx = random.randrange(0, display_width) dodged += 1 thing_speed+=2 if y < thing_starty+thing_height: cow = 5 if x > thing_startx and x < thing_startx + thing_width or x+ship_width > thing_startx and x+ship_width< thing_startx +thing_width: crash() pygame.display.update() clock.tick(60) game_intro() game_loop() pygame.quit() quit() 。这需要扫描整个表以生成该派生值,然后对结果进行排序,这通常涉及在磁盘上创建临时表。对于大量数据来说,它的速度非常慢。

由于您要排序的值是一个日期,并且由于SQL具有ORDER BY类型,非常适合存储这些类型,因此请确保DATE类型为date并添加索引在该列上处理订购。

理想情况下,您可以从MyISAM切换到InnoDB,可以更好地进行调整,并借此机会将列重命名为DATE以外的保留关键字。

答案 1 :(得分:-2)

您可以在所需的列上创建mysql索引。 如果您需要:How do I add indices to MySQL tables?。 感谢