Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL表上的索引会提高我的网站性能吗?_Mysql_Sql - Fatal编程技术网

MySQL表上的索引会提高我的网站性能吗?

MySQL表上的索引会提高我的网站性能吗?,mysql,sql,Mysql,Sql,我有两个非常简单的表格: CREATE TABLE `tbl_words` ( `fld_id` int(11) NOT NULL AUTO_INCREMENT, `fld_word` varchar(255) DEFAULT NULL, `fld_cat_id` int(11) DEFAULT NULL, PRIMARY KEY (`fld_id`) ); 这有一个很长的单词列表,其中列出了大约10500个单词。每个单词中都有一个CatID,对应于此表中的一个单词类别: CR

我有两个非常简单的表格:

CREATE TABLE `tbl_words` (
  `fld_id` int(11) NOT NULL AUTO_INCREMENT,
  `fld_word` varchar(255) DEFAULT NULL,
  `fld_cat_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`fld_id`)
);
这有一个很长的单词列表,其中列出了大约10500个单词。每个单词中都有一个CatID,对应于此表中的一个单词类别:

CREATE TABLE `j_word_cat` (
  `fld_id` int(11) NOT NULL AUTO_INCREMENT,
  `fld_cat` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`fld_id`)
);
从这些表中获取数据的页面每月可获得约500000次页面浏览量。表中的数据是相当静态的,很少更新

我发现我使用的MySQL数据库每天都会返回很多这样的错误:

查询期间与MySQL服务器的连接中断

我想知道——如果我在“tbl_单词”表中添加一个新的索引,例如一个名为“catID”的索引,并链接到“fld_cat_id”列,性能会得到改善吗

或者我应该创建一个同时使用fld_id和fld_cat_id的索引吗

任何建议都将不胜感激

谢谢

更新 我的查询非常简单——实际上我并没有加入表

用户从j_word_cat表中选择一个类别,然后使用该ID生成一个随机的单词列表,例如我正在运行的一些常见查询:

-- Category table to populate SELECT drop down list of categories:
SELECT fld_cat, fld_id FROM j_word_cat ORDER BY fld_cat;

-- common word table selects:
-- the NOT IN bit is to exclude one category which I want to exclude by default unless the user actually chooses it
SELECT fld_word FROM tbl_words WHERE fld_cat_id NOT IN (24) ORDER BY RAND() LIMIT 50;

-- note that the value of 15 would vary depending on the category the user selected
-- 15 is just an example

SELECT fld_word FROM tbl_words WHERE fld_cat_id = 15 ORDER BY RAND() LIMIT 50;

SELECT fld_word FROM tbl_words ORDER BY RAND() LIMIT 60;

根据您的查询,您需要以下索引

j_word_cat(fld_cat) # because you are sorting by this field
tbl_words(fld_cat_id) # because you are filtering by this field
由于您没有加入表,也没有按不同的列进行筛选,因此不应该创建不需要的复合索引


我会推荐你去读那些对我帮助很大的书。注意:它有点老,讲的是SQL server,但了解SQL索引非常有用。

索引会加快选择速度,降低插入和更新速度,但是我经常处理具有数百万条记录的表,如果使用适当的索引,我们可以将查询速度从4到5分钟降低到1秒以下,对插入和更新的影响可以忽略不计

如果您创建了一些索引并想知道它们是否被使用,那么您可以使用mysql解释工具查看您的查询

EXPLAIN SELECT fld_word 
FROM tbl_words WHERE fld_cat_id NOT IN (24) 
ORDER BY RAND() LIMIT 50;
在结果中,您将看到一个可能的索引列表和最终选定的索引。请特别注意“rows”列,因为这将显示它必须为结果中的每个表扫描多少行

最终,您希望争取在服务器上运行零个未编制索引的查询,并且运行的查询应该扫描尽可能少的行。。我的建议是打开mysql.ini文件中的未索引查询日志,并在合理的情况下修复所有查询

如果您加入、订购或使用where可以提高性能,如果您只选择无序信息而不加入,则不会

应为fld_cat_id编制索引

您的主键应该声明为主键。如果您想完全优化它们,那么请使它们不为null、无符号、自动递增,并将它们指定为主键

如果您正在执行类似于where fld_word='bla'的操作,那么应该将其与使用的任何连接键一起编入索引

如果您有一个小型数据库,那么性能的提高可以忽略不计,但是这并不是懒惰于良好设计的理由

更多阅读:


您针对这些表运行哪些查询?需要这些信息来确定所需的最佳索引。简短的回答是肯定的!但也张贴您的查询,他们可能需要优化以及!感谢您的快速回复-我已经发布了一些最常用的查询