The problem
Every AJAX request containing any DB query is taking a lot more time than normal.
I haven't updated the codebase since a week, but all of a sudden all the DB queries done in an AJAX request is taking a lot of time. A thing to notice here is that if the query is written in a page and then the page is normally loaded like if you were to visit: www.example.com/mypage.php
,
mypage.php:
<?php
$query = $db_handler->prepare(
"SELECT * FROM table_x LIMIT 5"
);
$query->execute();
$fetch = $query->fetchAll(PDO::FETCH_ASSOC);
?>
The page loads up very quickly with all the result.
But if its done in an AJAX's response file it takes a lot of time(say 15secs) to load
AJAX Code on client-side:
$.ajax
({
url: 'server_files/ajaxtest.php',
type: 'POST',
dataType: 'JSON',
data:
{
data: 'some data'
},
success: function(data)
{
if( data.success === true )
{
}
else if( data.success === false )
{
}
},
error: function(e)
{
alert('Error');
}
});
ajax_response.php:
<?php
header('Content-Type: application/json');
if( isset($_POST['data']) )
{
$query = $db_handler->prepare(
"SELECT * FROM table_x LIMIT 5"
);
$query->execute();
$fetch = $query->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'success' => true,
'response' => $fetch
]);
}
?>
^ takes 15 sec to load ( A query with 5 row sets(LIMIT 5
) is taking the same time as a query with 10 row sets(LIMIT 10
). )
if the same file contains only this
<?php
header('Content-Type: application/json');
if( isset($_POST['data']) )
{
echo json_encode([
'success' => true
]);
}
?>
^ takes 300-400ms to load
Obviously a query will increase the response time a little(1-3secs) but 15secs is too much.
What I've done
1) I've contacted my hosting provider, but that didn't helped much.
2) I've also installed mysqltuner and it shows this:
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.49-0ubuntu0.14.04.1-log
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[--] Data in MyISAM tables: 27K (Tables: 13)
[--] Data in InnoDB tables: 6M (Tables: 21)
[!!] Total fragmented tables: 21
-------- Security Recommendations -------------------------------------------
[!!] User '[email protected]' has no password set.
[!!] User 'rootAlbert@::1' has no password set.
[!!] User 'rootAlbert@lamp' has no password set.
-------- Performance Metrics -------------------------------------------------
[--] Up for: 11h 23m 42s (21K q [0.533 qps], 11K conn, TX: 6M, RX: 2M)
[--] Reads / Writes: 92% / 8%
[--] Total buffers: 432.0M global + 2.7M per thread (151 max threads)
[OK] Maximum possible memory usage: 837.8M (84% of installed RAM)
[OK] Slow queries: 2% (488/21K)
[OK] Highest usage of available connections: 3% (6/151)
[OK] Key buffer size / total MyISAM indexes: 16.0M/156.0K
[OK] Key buffer hit rate: 99.2% (133 cached / 1 reads)
[OK] Query cache efficiency: 61.9% (6K cached / 10K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 113 sorts)
[!!] Temporary tables created on disk: 50% (421 on disk / 842 total)
[OK] Thread cache hit rate: 99% (6 created / 11K connections)
[OK] Table cache hit rate: 33% (75 open / 223 opened)
[OK] Open file limit used: 1% (76/6K)
[OK] Table locks acquired immediately: 100% (4K immediate / 4K locks)
[OK] InnoDB data size / buffer pool: 6.5M/128.0M
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
MySQL started within last 24 hours - recommendations may be inaccurate
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
tmp_table_size (> 16M)
max_heap_table_size (> 16M)
3) Searched a lot and updated my my.cnf
file.
This is my my.cnf
file (this file looked a bit different at the time when the problem occurred)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
local-infile=0
log=/var/log/mysql-logfile
skip_name_resolve
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
slow-query-log = 1
slow-query-log-file = /var/log/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes
key_buffer = 16M
max_allowed_packet = 32M
thread_stack = 192K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_type=1
query_cache_limit=2M
query_cache_size=256M
tmp_table_size=16M
max_heap_table_size=16M
table_cache=3084
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
big-tables
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 16M
!includedir /etc/mysql/conf.d/
4) Optimized all the tables in the DB
5) I had also upgraded my server from 1GB memory and 1CPU, 2TB Transfer
to 2GB memory and 2CPUS, 3TB Transfer
I'm still not getting why is it happening and how to solve this.
Queries can become slow for various reasons ranging from improper index usage to bugs in the storage engine itself. However, in most cases, queries become slow because developers or MySQL database administrators neglect to monitor them and keep an eye on their performance.
ajax({ url: "make_update. php", type: "POST", data: { data: xhrData }, cache: false, success: function (response) { for(var i in response) { if (response[i] != '') { /* alert(response[i]); */ } } } });
MySQL has a built-in slow query log. To use it, open the my. cnf file and set the slow_query_log variable to "On." Set long_query_time to the number of seconds that a query should take to be considered slow, say 0.2. Set slow_query_log_file to the path where you want to save the file.
The problem was in the connection string. I was using my domain name (example.com
) for connecting to the Database. So I changed it to my IP address and it resolved the problem.
Thanks everyone for your help.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With