Jump to content

Need Help Optimizing mysql / code - Can Pay


vexious

Recommended Posts

I'm having huge problems.... I just purchased a high powered VPS 1gb memory ect ect however my CPU usage is extremely high and fluctuating... from 65-100% usage.... And I'm also getting timeouts(Assuming timeouts are from such high cpu usage...?)..

 

I need help on how to optimize the sql database and or code... The database is getting like 300+ quries a second or so i believe...

 

Anyways heres my code: - Let me know if you can help..

 


Table:
CREATE TABLE `invites` (
  `user` int(11) NOT NULL default '0',
  `name` VARCHAR(100) NOT NULL default '0',
  `count` int(11) NOT NULL default '0',
  `time` int(11) NOT NULL default '0'
);


<?php
require_once 'include.php'; 

if ( checkInvites($user,"zip",$_POST['ids'],$mysql) == TRUE ) { 
include "need.php";
} else {
include "main.php";
}

    function checkInvites($uid, $appName, $ids, $mysql)
    {
	$conn = mysql_connect($mysql['host'],$mysql['user'],$mysql['pass']);
		@mysql_select_db($mysql['db']) or die( "Unable to select database");
	$time = time();
        if ( $ids == NULL ) {
            $count = 0;
        } else {
            $count = count($ids);
        }

   		$query = "SELECT `count` FROM invites WHERE `user` = $uid AND `appname` = '$appName'";
	$result = mysql_query($query,$conn);
	if ( !( $result ) ) {
		echo "There was a problem with the Database!<br/>";
            echo mysql_error()."<br/>";
	}
	if( ! ( $row = mysql_fetch_row( $result ) ) ) {
		$query = "INSERT INTO invites VALUES($uid,'$appName',$count,$time);";
		$result = mysql_query($query,$conn);
		if ( !( $result ) ) {
                echo "There was a problem with the Database!<br/>";
                echo mysql_error()."<br/>";
		}
            if ( $count == 20 ) {
                $equation = FALSE;
            } else {
                $equation = TRUE;
            }
	} else {
            if ( $row[0] == 20 ) {
                $equation = FALSE;
            } else {
                $query = "UPDATE invites SET `count` = count + $count WHERE `user` = $uid AND `appname` = '$appName';";
                $result = mysql_query($query,$conn);
                if ( !( $result ) ) {
                    echo "There was a problem with the Database!<br/>";
                    echo mysql_error()."<br/>";
                }
                if ( $count + $row[0] > 19 ) {
                    $equation = FALSE;
                } else {
                    $equation = TRUE;
                }
            }
        }
        $_count = -($count + $row[0] - 20);
        if ( $_count > 0 ) {
            echo "<div style='text-align: center; padding: 15px; font-weight: bold; font-size: 10pt;'>Add<span style='font-size: 13pt; color: red; font-weight:bold;'>$_count</span>Before Proceeding.</div>";
        }

        mysql_close($conn);
        return $equation;
    }

?>

Link to comment
https://forums.phpfreaks.com/topic/82373-need-help-optimizing-mysql-code-can-pay/
Share on other sites

A few questions:

 

Are you sure that is the code that is causing the problem?

 

How many records are in your `invites` table?

 

Do you have any indexes in the `invites` table?

 

How often is that code run?  I know you said the DB is receiving ~300 queries per second, but is that because that code is executed on every page load? Every couple page loads?

 

How many users are hitting your site?

I notice in your CREATE TABLE you have a `name` column but in your code you refer to `appname`.

 

Since your SELECT and UPDATE queries are searching on the `user` and `name` columns, try adding an appropriate INDEX to your table:

   ALTER TABLE `invites` ADD INDEX ( `user` , `name` )  

 

It's probably not advisable to create an INDEX on the entire `name` column as it's 100 characters long, you can limit the size of the INDEX with:

ALTER TABLE `invites` ADD INDEX ( `user` , `name` (12) )  

Someone with more MySQL experience than I have can tell you if that's a better practice than using the entire field.

 

If you have access to phpMyAdmin you should try running the queries directly from there and use EXPLAIN to get more information about how MySQL is running them.

 

P.S.  Use `name` or `appname` in your SQL statements depending on what the column is actually called in the table.

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.