---
title: MySQLSearchTool
description: A tool for semantic search within MySQL database tables using RAG capabilities
icon: database
---

## MySQLSearchTool

The MySQLSearchTool enables semantic search capabilities for MySQL database tables using Retrieval-Augmented Generation (RAG). It processes table contents and allows natural language queries to search through the data.

## Installation

```bash
pip install 'crewai[tools]'
```

## Usage Example

```python
from crewai import Agent
from crewai_tools import MySQLSearchTool

# Initialize the tool
mysql_tool = MySQLSearchTool(
    table_name="users",
    db_uri="mysql://user:pass@localhost:3306/database"
)

# Create an agent with the tool
researcher = Agent(
    role='Database Researcher',
    goal='Search and analyze database contents',
    backstory='Expert at finding relevant information in databases.',
    tools=[mysql_tool],
    verbose=True
)
```

## Input Schema

```python
class MySQLSearchToolSchema(BaseModel):
    search_query: str = Field(
        description="Mandatory semantic search query you want to use to search the database's content"
    )
```

## Function Signature

```python
def __init__(
    self,
    table_name: str,
    db_uri: str,
    **kwargs
):
    """
    Initialize the MySQL search tool.

    Args:
        table_name (str): Name of the table to search
        db_uri (str): Database connection URI
        **kwargs: Additional arguments for RAG tool configuration
    """

def _run(
    self,
    search_query: str,
    **kwargs: Any
) -> str:
    """
    Execute semantic search on table contents.

    Args:
        search_query (str): Query to search in the table
        **kwargs: Additional arguments

    Returns:
        str: Relevant content from the table matching the query
    """
```

## Best Practices

1. Database Connection:
   - Use secure connection URIs
   - Handle authentication properly
   - Manage connection lifecycle
   - Monitor timeouts

2. Query Optimization:
   - Structure queries clearly
   - Consider table size
   - Handle large datasets
   - Monitor performance

3. Security Considerations:
   - Protect credentials
   - Use environment variables
   - Limit table access
   - Validate inputs

4. Error Handling:
   - Handle connection errors
   - Manage query timeouts
   - Provide clear messages
   - Log issues

## Integration Example

```python
from crewai import Agent, Task, Crew
from crewai_tools import MySQLSearchTool

# Initialize tool
mysql_tool = MySQLSearchTool(
    table_name="customers",
    db_uri="mysql://user:pass@localhost:3306/crm"
)

# Create agent
researcher = Agent(
    role='Database Analyst',
    goal='Extract customer insights from database',
    backstory='Expert at analyzing customer data.',
    tools=[mysql_tool]
)

# Define task
analysis_task = Task(
    description="""Find all premium customers 
    with recent purchases.""",
    agent=researcher
)

# The tool will use:
# {
#   "search_query": "premium customers recent purchases"
# }

# Create crew
crew = Crew(
    agents=[researcher],
    tasks=[analysis_task]
)

# Execute
result = crew.kickoff()
```

## Advanced Usage

### Multiple Table Analysis
```python
# Create tools for different tables
customers_tool = MySQLSearchTool(
    table_name="customers",
    db_uri="mysql://user:pass@localhost:3306/crm"
)

orders_tool = MySQLSearchTool(
    table_name="orders",
    db_uri="mysql://user:pass@localhost:3306/crm"
)

# Create agent with multiple tools
analyst = Agent(
    role='Data Analyst',
    goal='Cross-reference customer and order data',
    tools=[customers_tool, orders_tool]
)
```

### Secure Connection Configuration
```python
import os

# Use environment variables for credentials
db_uri = (
    f"mysql://{os.getenv('DB_USER')}:{os.getenv('DB_PASS')}"
    f"@{os.getenv('DB_HOST')}:{os.getenv('DB_PORT')}"
    f"/{os.getenv('DB_NAME')}"
)

tool = MySQLSearchTool(
    table_name="sensitive_data",
    db_uri=db_uri
)
```

### Error Handling Example
```python
try:
    mysql_tool = MySQLSearchTool(
        table_name="users",
        db_uri="mysql://user:pass@localhost:3306/app"
    )
    results = mysql_tool.run(
        search_query="active users in California"
    )
    print(results)
except Exception as e:
    print(f"Error querying database: {str(e)}")
```

## Notes

- Inherits from RagTool
- Uses MySQLLoader
- Requires database URI
- Table-specific search
- Semantic query support
- Connection management
- Error handling
- Performance optimization
- Security features
- Memory efficiency
