我的MySQL表上的索引会改善我的网站性能吗?

时间:2014-03-04 21:47:26

标签: 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`)
);

这里有很长的单词列表,其中列出了大约10,500个单词。每个单词中都有一个CatID,它对应于此表中的单词类别:

CREATE TABLE `j_word_cat` (
  `fld_id` int(11) NOT NULL AUTO_INCREMENT,
  `fld_cat` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`fld_id`)
);

从这些表中获取数据的页面每月可获得大约500,000次页面查看。表中的数据非常静态,很少(如果有的话)更新。

我发现我正在使用的MySQL数据库每天都会返回一些错误:

查询期间与MySQL服务器的连接丢失

我想知道 - 如果我在“tbl_words”表中添加新索引(例如,名为“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;

2 个答案:

答案 0 :(得分:0)

根据您的疑问,您需要以下索引

j_word_cat(fld_cat) # because you are sorting by this field
tbl_words(fld_cat_id) # because you are filtering by this field

由于您没有加入表,并且没有按不同的列进行过滤,因此不应创建不需要的复合索引。

我建议你阅读帮助了我很多的this article。注意:它有点旧,并且谈论SQL服务器,但它对于理解SQL索引非常有用。

答案 1 :(得分:0)

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

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

EXPLAIN SELECT fld_word 
FROM tbl_words WHERE fld_cat_id NOT IN (24) 
ORDER BY RAND() LIMIT 50;

在您的结果中,您将看到可能的索引列表和最终选择的索引。请特别注意“行”列,因为这将显示它必须扫描结果中每个表的行数。

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

如果您加入或订购或使用它将提高性能,如果您只是选择无序信息而不加入则不会。

fld_cat_id应编入索引

您的主键应该如此声明。如果要完全优化它们,请将它们设置为null,unsigned,auto_increment并将它们指定为主键。

如果您正在执行fld_word ='bla'之类的操作,则应将其与所使用的任何连接键一起编入索引。

如果你有一个小型数据库,那么性能提升可以忽略不计,但是没有理由对好的设计保持懒惰。

更多阅读: