簡體   English   中英

如何提高mysql查詢的性能?

[英]how to increase performance of mysql query?

我正在使用此查詢來檢查用戶名是否已經存在或者沒有在數據庫中使用ajax所以到目前為止我只有幾個記錄在DB bt在未來的用戶名列表將是巨大的所以我想以這樣的方式提高查詢的性能檢查用戶名存在會花費更少的時間。

我該如何改進以下查詢? 對db進行索引是可行的解決方案嗎?

check.php

<?php
if(isset($_POST['user_name']))
{
$user_name=$_POST['user_name'];
include("include/conn.php");
$sql_check = mysql_query("select userid from `vector`.`signup` where userid='".$user_name."'")
 or die(mysql_error());

if (mysql_num_rows($sql_check)>0)
{   
    echo "no";
} 
else
{
 echo "yes";
}
}
?> 

my jquery code 

<script language="javascript">

$(document).ready(function()
{
    $("#uname").blur(function()
    {
                $("#msgbox").removeClass().addClass('messagebox').text('Checking...').fadeIn("slow");

        $.post("check.php",{ user_name:$(this).val() } ,function(data)
        {
          if(data=='no') //if username not avaiable
          {
            $("#msgbox").fadeTo(200,0.1,function() 
            { 

              $(this).html('This User name Already exists').addClass('messageboxerror').fadeTo(900,1);
            });     
          }
          else
          {
            $("#msgbox").fadeTo(200,0.1,function()  
            { 

              $(this).html('Username available to register').addClass('messageboxok').fadeTo(900,1);    
            });
          }

        });

    });
});
</script>

在vector.signup表的userid列上創建索引可能會解決您的性能問題。

目前,您的腳本中存在嚴重的安全漏洞。 您永遠不應該將POST數據直接注入到查詢中,因為您可以自行打開SQL注入攻擊。 您應該首先轉義數據:

$ user_name = mysql_real_escape_string($ _ POST ['user_name']);

你可以在這里閱讀更多:

http://php.net/manual/en/function.mysql-real-escape-string.php

是的,您應該在userid字段上添加索引。 對於mysql,它看起來像這樣:

ALTER TABLE `vector`.`signup` ADD INDEX(userid);

編輯 :一旦連接到數據庫,就可以在MySQL控制台中使用此行。 如果您使用的是PHPMyAdmin,它還支持在GUI中添加索引。

作為開發人員,您確實需要關注安全性,性能和組織。 以下是我將重新編寫代碼以便於閱讀和更安全的方法。 希望它可以幫助你:

<?php

$strUsername = isset($_POST['user_name']) ? $_POST['user_name'] : NULL;

if(!empty($strUsername)) {

    require("include/conn.php"); // Consider using require_once() if it makes sense

    $objResults = mysql_query(sprintf('SELECT userid
                                FROM vector.signup
                                WHERE userid = "%s"
                                LIMIT 1', mysql_real_escape_string($strUsername)));

    if ($objResults === FALSE) {

        // Log the mysql_error() (dont show it to the user for security reasons)
        exit('Insert user friendly error message');

    } else {

        if (mysql_num_rows($objResults) === 1) {

            echo "Yes";

        } else {

            echo "No";

        }

    }

} else {

    echo "Invalid input error message";

}
?>

有兩種用例:

1)如果您不介意搜索用戶名的最終用戶可以使用用戶列表,您可以一次性獲取完整列表並使用javascript函數為用戶提供每個按鍵的選項。

2)如果你不想給最終用戶完整列表,你可以放心使用你正在使用的方法。只需要在用戶名上編制索引。即使對於數百萬條記錄也是如此。

謝謝,

Shashwat

您可以在用戶鍵入時將請求延遲到服務器。 以下示例僅在沒有鍵按下至少一秒時調用myAjaxFunc函數。 (所以打字時沒有來電通話。)

<input type="text" name="username" onkeypress="ajaxRefresh()">

<script>
    window.ajaxTimeout = false;

    function ajaxRefresh() {
        if (window.ajaxTimeout) {
            clearTimeout(window.ajaxTimeout);
            window.ajaxTimeout = false;
        }
        window.ajaxTimeout = setTimeout(myAjaxFunc, 1000);
    }

    function myAjaxFunc() {
        // do your AJAX stuff
    }
</script>

你不能優化查詢本身,因為它只是搜索列中的id,這就是必須要做的事情。 但是您可以向列添加索引,因此您的dbms准備好有效地搜索列。 你可能會選擇使用iso-whatever而不是utf-8。 然后排序對你的db更快,b / c該字段占用更少的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM